2014-09-26 67 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. 艺术家,标题或专辑串没有足够的空间来容纳你想在阅读中的字符串。