簡體   English   中英

程序嘗試為結構的指針成員分配malloc時出現分段錯誤

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

我編寫了在Netbeans上運行良好的代碼,但在膩子上卻出現了段錯誤。 我嘗試使用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;
  }

在您的代碼中,通過init_vector()函數,您可以直接訪問傳遞的指針,例如

  v->data

和更多。 如果傳遞的指針為NULL或無效 ,則將調用未定義的行為

在您的情況下, vec是未初始化的自動局部變量,其內容是不確定的。 因此,指針本質上指向無效的內存。 嘗試訪問它會調用UB。

避免

  1. 總是最好初始化自動局部變量( 此處為NULL指針 ),然后對傳入的指針進行( NULL )檢查。
  2. 將內存地址傳遞給有效的 init_vector

第二步,您可以傳遞標量變量的地址,例如

 vector *v;
 init_vector(&v);

使事情起作用。

另一種可能性是,在將內存傳遞給init_vecor()之前,使用malloc()或類似的分配器函數將內存分配給main() vec

總的來說,您聲明一個*vec; ,然后開始使用它,但是它永遠不會與任何內存關聯。 細分錯誤正是我所期望的。

將其聲明為vector vec; ,然后將其地址傳遞給調用( &vec ),問題得到解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM