typedef struct data
{
int *data_array;
int *thread_number;
}array;
....
int main(int argc, char *argv[]){
...
int size = atoi(argv[1]);
array *array_ptr;
array_ptr->data_array = malloc((size+2)*sizeof(int));//failing line
....
}
由于失败的线路,它给了我seg。故障
怎么解决呢?
答案 0 :(得分:4)
在您的代码中,
array *array_ptr;
array_ptr->data_array = malloc((size+2)*sizeof(int));//failing line
array_ptr
本身未经初始化使用。如果您尝试取消引用单位化指针,则会调用undefined behavior。分段错误是UB的众多效果之一。
您应首先将内存分配给array_ptr
,例如
array *array_ptr = NULL;
array_ptr = malloc(sizeof *array_ptr);
if (array_ptr) //check for malloc success
{
array_ptr->data_array = malloc((size+2)*sizeof(int));
.....
}
else
{
printf("failure\n");
exit(-1);
}
答案 1 :(得分:1)
定义像这样的局部变量时
array *array_ptr;
array_ptr
指针在内存中被赋予一个位置,但它没有指向内存中的有效array
结构:未初始化变量的值包含一些随机的“垃圾”值。因此,以任何方式解除引用,包括
array_ptr->data_array = malloc ...
是未定义的行为。
您可以通过为array
指向的array_ptr
分配一些内存来修复它,如下所示:
array *array_ptr = malloc(sizeof(array));
答案 2 :(得分:0)
由于您没有为 array_ptr 创建任何内存,并且您正在尝试引用它,最终将尝试访问data_array(目前还没有内存),因此预计会出现分段错误。所以,内核将告知该过程终止,因此您将在此处获得分段错误。
int size = atoi(argv[1]);
array *array_ptr;
array_ptr->data_array = malloc((size+2)*sizeof(int));//failing line
但是,为了解决这个问题,你首先要为array_ptr创建内存。
array *array_ptr = (array * )malloc(sizeof(array));//type casting is necessary as malloc returns pointer to void .
在此之后,您可以检查指针并为其数据成员分配内存
if(array_ptr )
{
array_ptr->data_array = malloc((size+2)*sizeof(int));//type cast here also
}
答案 3 :(得分:0)
int size = atoi(argv[1]);
array *array_ptr;
array_ptr->data_array = (*int) malloc(sizeof(int)*(size+2));
作品?
- 编辑 -
我从argv获取数字并在int中进行转换。 创建结构。 我创建的内存大小比int plus(arg + 2)大,并在结构中关联它,只有