使用fscanf和malloc进行分段错误

时间:2015-02-12 03:14:13

标签: c

void fill_garage(Car** garage, char* cars, int* size)
 43 {
 44     int i;
 45     FILE* file=fopen(cars,"r");
 46     fscanf(file,"%d",size);
 47     *garage=malloc(sizeof(Car)**size);
 48     printf("%d",*size);
 49     for(i=0;i<*size;i++)
 50     {
 51         (*garage)[i].make=malloc(sizeof(char)*MAX_STRING_LEN);
 52         (*garage)[i].model=malloc(sizeof(char)*MAX_STRING_LEN);
 53         fscanf(file,"%d%s%s%d",(*garage)[i].year,(*garage)[i].make,(*garage)[i].model,(*garage)[i].miles);
 54     }
 55     fclose(file);
 56 }

我在这段代码上遇到了分段错误,gdb返回车库[i] - &gt; make line就是这个原因,但我无法弄清楚为什么这条线会出现seg故障。

2 个答案:

答案 0 :(得分:1)

具有fscanf格式的

%d需要指针int作为参数。您显然试图传递int本身而不是指针

fscanf(file,"%d%s%s%d", 
  &(*garage)[i].year,
  (*garage)[i].make,
  (*garage)[i].model,
  &(*garage)[i].miles);

请注意&运算符在fscanf

的参数中的位置

答案 1 :(得分:0)

使用garage[i]->时出错了。您应该使用(*garage)[i].代替。使用garage[i],您不会遍历已分配的数组,而是直接接近garage指针的内存,然后尝试写入它,这很可能导致段错误。

现在您已更改代码以传递值而不是指向fscanf的指针。您应该使用&(*garage)[i].year&(*garage)[i].miles