[英]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。
避免
NULL
指針 ),然后對傳入的指針進行( NULL
)檢查。 init_vector
。 第二步,您可以傳遞標量變量的地址,例如
vector *v;
init_vector(&v);
使事情起作用。
另一種可能性是,在將內存傳遞給init_vecor()
之前,使用malloc()
或類似的分配器函數將內存分配給main()
vec
。
總的來說,您聲明一個*vec;
,然后開始使用它,但是它永遠不會與任何內存關聯。 細分錯誤正是我所期望的。
將其聲明為vector vec;
,然后將其地址傳遞給調用( &vec
),問題得到解決。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.