程序在尝试为结构的指针成员分配内存时出现分段错误
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。
避免
- 始终最好初始化自动局部变量(此处,指向
NULL
的指针)并对传入指针进行 (NULL
) 检查。
- 将内存地址传递给
init_vector
,这是有效。
第二步,你可以传递一个标量变量的地址,比如
vector *v;
init_vector(&v);
让事情正常进行。
另一种可能性是,在将内存传递给 init_vecor()
.
之前,使用 malloc()
或类似的分配器函数将内存分配给 main()
中的 vec
我编写的代码在 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。
避免
- 始终最好初始化自动局部变量(此处,指向
NULL
的指针)并对传入指针进行 (NULL
) 检查。 - 将内存地址传递给
init_vector
,这是有效。
第二步,你可以传递一个标量变量的地址,比如
vector *v;
init_vector(&v);
让事情正常进行。
另一种可能性是,在将内存传递给 init_vecor()
.
malloc()
或类似的分配器函数将内存分配给 main()
中的 vec