使用fgets()读取文件的最后一行时出现段错误

时间:2019-03-30 17:38:42

标签: c segmentation-fault fgets

我正在解决数据结构分配的编码问题,当使用fgets()读取文本文件的最后一行时,我的解决方案的一部分一直给我一个segfault: 11

我已经在StackOverflow上搜索了一段时间,找不到我遇到的相同错误。我已经尝试了多种方法来解决问题,但我无法弄清楚到底是什么问题。

int main() {
    **S = func();
    free(S);
    return 0;
}

char** func() {
    FILE *fStrings = fopen("file.txt", "r");
    if (fStrings == NULL) printf("Error opening 'file.txt'\n")
    int length = fileLength("file.txt");  // This returns just the number of lines in a file, works as intended.
    char **strings = (char **)malloc(200 * length * sizeof(char));
    f(length, (char (*)[200])strings, *fStrings);
    // some code using the data modified by f()
    fclose(fStrings);
    return strings;
}

void f(int length, char strings[][200], FILE *fStrings) {
    int i;
    for (i = 0; i <= length; i++) {
        printf("i = %d\n", i);  // debug
        fgets(strings[i], 200, fStrings);  // Here's the problem
        printf("string = %s\n", strings[i]);  // debug
    }
}

上面的代码有2条调试行,以查看错误的确切位置。使用正确的参数调用该函数,其中length是数组中字符串的数量,strings是字符串数组,而fStrings是具有所述字符串的文件。

尝试读取文本文件的最后一行时,发生segfault。任何帮助将不胜感激。

编辑:更改了代码块,以包含更好的代码版本,以防它变得更易于理解。正确的库也包括在内。

1 个答案:

答案 0 :(得分:0)

我认为您的代码的主要问题是这一行

for (i = 0; i <= length; i++) {

由于<=,它将循环“长度+ 1”次,但是您只为“长度”时间分配了内存。更改为:

for (i = 0; i < length; i++) {

您的分配很奇怪。您应该使用指向1D数组的指针分配2D数组,例如:

char (*strings)[200] = malloc(length * sizeof *strings)

然后您可以进行任何呼叫,而无需进行任何投射。

也刚刚注意到这一行:

f(length, (char (*)[200])strings, *fStrings);
                                  ^
                                  notice

我认为您不希望*前面的fStrings(它甚至不应该与*一起编译)

通过正确的分配(如上所述),呼叫应为:

f(length, strings, fStrings);