【发布时间】:2012-03-27 13:36:11
【问题描述】:
我从 fgets 得到一个分段,但只是有时。这是别人的代码,我不懂makefile,所以我用printf语句调试...我把它放在main函数的两个部分:(我只创建变量*f和line一次,但我两次 fopen 和 fclose 文件。)
FILE *f = NULL;
char line[1000];
if ((f=fopen(filename,"r+"))==NULL)
{
printf("Error opening file\n");
f=0;//...handle error... //(usually just call abort() or return -1
}
//f = rfopen(fname, "r+");
printf("f from eval_args: %d, filename %s\n",f,filename);
printf("trying to read from file...\n");
printf("%s\n",fgets(line, sizeof (line), f));
printf("...succeeded\n");
fclose(f);
这给了我两个不同的输出:
f from eval_args: 4609600, filename /correct/path/to/file
trying to read from file...
100
...succeeded
f prior to entering density profile: 4609600, filename /correct/path/to/file
trying to read from file...
Segmentation fault (core dumped)
我检查文件是否正确打开,并防止读取超出“行”的字符。我在一个论坛上看到文件名的长度不应超过 49 个字符...但是 a) 这是一个奇怪的限制 b) 为什么它第一次起作用?
有人知道我还能检查什么吗?
【问题讨论】:
-
遇到 NULL 字符串时 printf() 不打印
(null)吗? -
您能否发布一个可重现该问题的小型可编译程序?
-
首先你应该把
fgets作为一个单独的语句,然后你应该使用调试器来帮助你定位和检查错误。 -
感谢@Joachim 的建议,我将 fgets 放在了自己的行上,并且段错误肯定存在。现在我必须弄清楚为什么这个低级函数会为相同的输入提供不可重现的行为......
-
@H2CO3,从一个快速的谷歌搜索,它似乎没有很好的定义,但对我来说, printf("%s \n",NULL) 也会导致一个段错误,所以我可能有两个之前的问题。
标签: c segmentation-fault fgets