【问题标题】:segfault when reading last line of file using fgets()使用 fgets() 读取文件最后一行时出现段错误
【发布时间】:2019-03-30 17:38:42
【问题描述】:

我正在解决数据结构分配的编码问题,当使用 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 在尝试读取文本文件的最后一行时出现。任何帮助将不胜感激。

编辑:更改了代码块以包含我的代码的更好版本,以防它更容易理解。还包括正确的库。

【问题讨论】:

  • 您的指针计算不起作用。为什么不正确使用数组,比如strings[i],就像你在printf 中所做的那样?出于好奇,您是在哪里学会这样做的?
  • @SamiKuhmonen 指针计算很奇怪,为什么不行?
  • 您需要向我们展示您是如何调用函数的,以及如何定义和初始化参数。
  • @4386427 因为数组数组不一定在连续的内存中。它们可以在任何地方,因此无法访问结束。
  • for (i = 0; i &lt;= length; i++) { ==> for (i = 0; i &lt; length; i++) {

标签: c segmentation-fault fgets


【解决方案1】:

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

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

由于&lt;=,它将循环“length + 1”次,但您只为“length”次分配了内存。将其更改为:

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);

【讨论】:

    猜你喜欢
    • 2021-03-14
    • 2023-04-07
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    相关资源
    最近更新 更多