2015-02-12 80 views
-4
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

回答

1

fscanf%d格式需要指針int作爲參數。您顯然是想通過int本身,而不是一個指針的

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

&運營商的位置在fscanf參數。

0

您錯誤地使用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