繁体   English   中英

分段错误 11 C

[英]Segmentation fault 11 C

遇到分段错误 11 错误。

/* Create main function */
int main()
{
    char line[9999999];
    FILE *fp;
    fp = fopen("file.txt", "r");
    while (fgets(line, 9999999, (FILE*)fp) != NULL)
    {
        if (strstr(line, "word") != NULL)
        {
            printf("%s", line);
        }
    }
    fclose(fp);
    return 0;
}

已经尝试将 9999999 减少到 256 但这也不起作用..

提前致谢

我认为有两个潜在的问题

问题 1 是堆栈。 堆栈是每个线程使用的(相对)少量内存,用于跟踪函数自动作用域的变量、输入和输出值等。 它不适用于大量数据。 您的line缓冲区很可能对于堆栈来说太大了!

如果你想要一个那么大的缓冲区,最好使用malloc()在堆上分配。 堆很大,如果分配失败,您可以检测到它并进行适当的处​​理。

问题 2 不检查fp的值。 fopen()无法打开文件,它可能会返回NULL 如果是这种情况,并且您将fp传递给fgets() ,则会出现段错误。

当我在我的机器上解决这两个问题时,你的程序运行了......

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFSIZE 99999

int main()
{
    char *line = malloc(BUFSIZE);
    FILE *fp = fopen("file.txt", "r");
    if(!line || !fp) {
       printf("OOPS");
       free(line);
       return 1;
    }

    while (fgets(line, BUFSIZE, fp) != NULL)
    {
        if (strstr(line, "word") != NULL)
        {
            printf("%s", line);
        }
    }
    fclose(fp);
    free(line);
    return 0;
}

注意fgets()读取的值最多比 size 参数小 1 并且会为您附加一个空终止符。

在我在 cygwin + gcc 4.9.3 下的测试中,当数组的大小为9999999而不是999999时,我的程序崩溃。

这里的罪魁祸首是数组太大而无法放入堆栈内存。

更简单的程序崩溃:

#define SIZE 9999999
int main()
{
    char line[SIZE];
    line[SIZE-1] = '\0';
    return 0;
}

当我将SIZE更改为:

#define SIZE 999999

在堆栈内存中创建大型数组是一个众所周知的问题。 请参阅为什么大型本地数组会导致我的程序崩溃? .

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM