为什么我在这个函数中遇到了段错误?

时间:2014-09-26 05:53:37

标签: c++

无论我尝试什么,我都会在这个函数的某个地方遇到一个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;
}

2 个答案:

答案 0 :(得分:2)

你正在增加numInputFiles,因为这个j总是&lt; numInputFiles。这会导致无限循环,这将导致您访问不应该访问的内存。

这里有几件事可能会出错:

  1. 你在歌曲阵列上走出界限。我的价值变得很大。
  2. 艺术家,标题或专辑字符串没有足够的空间容纳您尝试阅读的字符串。

答案 1 :(得分:0)

你有一个无限循环,肯定会超出界限。

for( j = 0; j < numInputFiles; j++ )
{
    FILE *file = fopen(inputFiles[j], "r");
到目前为止看起来还不错。但遗憾的是,在循环结束时你会这样做:

    numInputFiles++;
}
如果你在循环中递增它们,

j永远不会超过numInputFiles。您可能想要删除numInputFiles++;行。

此外,我们无法看到playlist数组的声明,但由于您无法检查playlist的大小,因此您可能还存在访问越界的风险。