【问题标题】:Program gives segmentation fault while trying to malloc for a pointer member of structure程序在尝试对结构的指针成员进行 malloc 时出现分段错误
【发布时间】:2016-09-05 16:50:19
【问题描述】:

我编写的代码在 netbeans 上运行良好,但在 putty 上出现了段错误。我试过用gdb,但似乎无能为力在哪给我

 Program received signal SIGSEGV, Segmentation fault.
 0x00000000004006c1 in init_vector ()
 (gdb) back trace 
  #0  0x00000000004006c1 in init_vector ()
  #1  0x0000000000400664 in main ()

这是我的代码,希望有人能帮助我

  typedef struct v_
 {
   int* data;
   int size;
   int capacity;
}vector;


   int main()
 {
    // vector of floats
     vector *vec;
     init_vector(vec); 
     insert_element_vector(vec, 5);

     int ele = access_element_vector(vec, 0);
      printf("%d\n", ele);
      return 0;
  }


   void init_vector( vector* v)
{
    v->data = malloc(sizeof(int) * INIT_VECTOR_SIZE);
     v->size = 0;
     v->capacity = INIT_VECTOR_SIZE;
 }



  void insert_element_vector( vector* v, int element_to_insert)
 {
   if(v->capacity == v->size)
   {
        v->data = realloc(v->data, sizeof(int) * v->capacity * 2);
        v->capacity *= 2;
   }
         v->data[v->size] = element_to_insert;
         v->size += 1;
  }

【问题讨论】:

    标签: c pointers segmentation-fault dereference


    【解决方案1】:

    在您的代码中,在init_vector() 函数中,您可以直接访问传递的指针,例如

      v->data
    

    等等。如果传递的指针为 NULL 或 无效,这将调用 undefined behavior

    在您的情况下,vec 是一个未初始化的自动局部变量,其内容是不确定的。因此,指针本质上指向无效内存。尝试访问它会调用 UB。

    避免

    1. 最好初始化自动局部变量(这里是指向NULL的指针)并检查(NULL)传入的指针。
    2. 将内存地址传递给init_vector,这是有效的

    第二步,你可以传递一个标量变量的地址,比如

     vector *v;
     init_vector(&v);
    

    让事情顺利进行。

    另一种可能性是,在将内存传递给init_vecor() 之前,使用malloc() 或类似的分配器函数将内存分配给main() 中的vec

    【讨论】:

      【解决方案2】:

      在 main 中,您声明了一个 *vec;,然后开始使用它,但它从未与任何内存相关联。分段错误正是我所期望的。

      将其声明为vector vec;,然后将其地址传递给调用(&vec),问题就解决了。

      【讨论】:

      • 当然。如果你喜欢那个。那么它将是vector *vec = malloc(sizeof(vector));
      • @Aganju 嗯.. 不是vector *vec = malloc(sizeof(*vec)); 吗?
      • 已更正。谢谢
      猜你喜欢
      • 1970-01-01
      • 2020-06-05
      • 1970-01-01
      • 2016-02-23
      • 2016-05-05
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多