【发布时间】:2014-12-07 09:04:05
【问题描述】:
我已经编写了一个程序来使用 strfry 进行字谜字符串。它适用于默认标准输入,但与 stdio 重定向一起使用时会崩溃(函数,但最后会出现段错误):
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "sys/mman.h"
int main(int argc,char *argv[]) {
FILE *fryend=stdin;
if (argc==1) goto mainloop;
if (argc>1) fryend=fopen(argv[1],"r") ? fryend : stdin;
mainloop:;
char *buf=malloc(4096);
while (!ferror(fryend)) {
memset(buf,0,4096);
strfry(fgets(buf,4095,fryend));
fputs(buf,stdout);
}
free(buf);
if (fryend!=stdin) fclose(fryend);
return 0;
}
这里有什么问题?使用 GNU libc/GCC。运行 valgrind 并没有检测到内存泄漏。
【问题讨论】:
-
您的
fgets呼叫始终在stdin上工作。如果fryend是一个文件,你应该fclose它,否则Valgrind会抱怨。我不确定strfry在NULL输入上的行为。我认为将fgets和strfry调用分开并检查NULL会更干净。 -
附带说明:在我看来,让失败的
fopen默默地退回到stdin并不是一个好的设计。 -
@M Oehm:它是一个stdio过滤器,就像
rev,所以回退到stdin是合理的。 -
好吧,也许吧。在此期间您对原始代码进行了所有更改,您是否仍然观察到相同的行为?
-
观察力不错。将
fgets(buf,4095,stdin)更改为fgets(buf,4095,fryend)应该会有所作为......