2014-09-26 73 views
-6

無論我嘗試什麼,我都會在此功能的某個位置出現seg故障。爲什麼我在這個功能中遇到seg故障?

int build_playlist(Song playlist[], char* inputFiles[], int numInputFiles) 
{ 

    int i = 0; 
    int j = 0; 

    for(j = 0; j < numInputFiles; j++) 
    { 
     FILE *file = fopen(inputFiles[j], "r"); 
     if (file == NULL) 
      { 
       printf("File could not be opened.\n"); 
       return -1; 
      } 
     while (1) 
     { 
      if (feof(file)) 
      { 
       break; 
      } 
      fscanf(file, "%s %s %s %d", playlist[i].artist, playlist[i].title, playlist[i].album, &playlist[i].rating); 

      i++; 
     } 
     fclose(file); 
     numInputFiles++; 
    } 

    return i; 
} 
+1

...使用調試器,單步執行代碼,看到它出現segfaults上線。這應該給你一個強烈的暗示。 – dandan78 2014-09-26 05:55:33

+0

什麼是「播放列表」?它是如何聲明的?它是如何傳遞給你的函數的?與'inputFiles'一樣,它是什麼,它是如何聲明和初始化? – 2014-09-26 05:55:54

回答

0

你有一個無限循環,肯定會出界。

for(j = 0; j < numInputFiles; j++) 
{ 
    FILE *file = fopen(inputFiles[j], "r"); 

目前看起來還不錯。但可悲的是在循環結束時,你做的事:

numInputFiles++; 
} 

j永遠不會成爲大於numInputFiles如果您在循環增加他們兩個。您可能要刪除numInputFiles++;一行。

此外,我們看不到playlist陣列的聲明,但由於您無處檢查playlist的大小,您可能還會冒着訪問越界的風險。

2

您正在增加numInputFiles,因爲此j將始終爲< numInputFiles。這會導致無限循環,這會導致您訪問您不應訪問的內存。

有幾件事情可以去錯在這裏還有:

  1. 你的歌曲陣列上會出界。我的價值變得很大。
  2. 藝術家,標題或專輯串沒有足夠的空間來容納你想在閱讀中的字符串。