使用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的分段错误

+0

'garage =&carsPtr;'应该是'* garage = carsPtr;'。你想告诉调用函数'carsPtr'。 – 2015-02-12 03:31:45

+0

检查'fscanf'的返回值。检查'* size'就是你认为的。你从来没有将任何内存分配给'carsPtr [i] .model'。 – 2015-02-12 04:31:30

+0

基本上你需要*调试你的代码*。如果你不能使用调试器,那么使用'printf'语句来确保程序的每一步都应该如此。 – 2015-02-12 04:31:51

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

+0

但当它在main中调用,然后通过引用传递它不会被初始化然后?当它在循环前的第一个fscanf中被调用时,它会从文件中读取一个整数值 – 2015-02-13 04:54:31

+0

@BrandonTomblinson:如果它没有被初始化,它甚至可以有一个负值,因为使用未初始化的变量是*未定义的行为*。即使这不是导致错误的原因,你也不应该这样做。 – Mints97 2015-02-13 04:57:33

+0

那么我需要在哪里初始化它呢?因为打开的文件在第一行有它 – 2015-02-13 04:58:21