程序在尝试为结构的指针成员分配内存时出现分段错误

Program gives segmentation fault while trying to malloc for a pointer member of structure

我编写的代码在 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;
  }

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

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

在您的代码中,在 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