使用fscanf和malloc的分段错误
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] - >使行是这个原因,但我不明白为什么这行会case一个seg故障。使用fscanf和malloc的分段错误
fscanf
与%d
格式需要指针到int
作为参数。您显然是想通过int
本身,而不是一个指针的
fscanf(file,"%d%s%s%d",
&(*garage)[i].year,
(*garage)[i].make,
(*garage)[i].model,
&(*garage)[i].miles);
注&
运营商的位置在fscanf
参数。
您错误地使用garage[i]->
。您应该使用(*garage)[i].
来代替。用garage[i]
,你不是遍历分配的数组,而是遍历指针直接接近的内存,然后尝试写入它,这很可能会导致段错误。
现在您已更改您的代码以传递值而不是指向fscanf
的指针。您应该使用&(*garage)[i].year
和&(*garage)[i].miles
。
但当它在main中调用,然后通过引用传递它不会被初始化然后?当它在循环前的第一个fscanf中被调用时,它会从文件中读取一个整数值 – 2015-02-13 04:54:31
@BrandonTomblinson:如果它没有被初始化,它甚至可以有一个负值,因为使用未初始化的变量是*未定义的行为*。即使这不是导致错误的原因,你也不应该这样做。 – Mints97 2015-02-13 04:57:33
那么我需要在哪里初始化它呢?因为打开的文件在第一行有它 – 2015-02-13 04:58:21
'garage =&carsPtr;'应该是'* garage = carsPtr;'。你想告诉调用函数'carsPtr'。 – 2015-02-12 03:31:45
检查'fscanf'的返回值。检查'* size'就是你认为的。你从来没有将任何内存分配给'carsPtr [i] .model'。 – 2015-02-12 04:31:30
基本上你需要*调试你的代码*。如果你不能使用调试器,那么使用'printf'语句来确保程序的每一步都应该如此。 – 2015-02-12 04:31:51