[英]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.