我遇到分段错误并使用gdb和backtrace,它被引发到vprintf。
#0 0x006e8779 in vfprintf () from /lib/libc.so.6
#1 0x006f265f in fprintf () from /lib/libc.so.6
#2 0x08049fd1 in write_tofile (logfile=0x9843090 "~/www/log") at example.c:446
当我致电
时会发生这种情况file = fopen(log_file, "a"); // log_file = "~/www/log"
fprintf(file, buffer);
可以fopen处理来自不同目录的文件吗?有人会有一个线索,为什么它会在这里发生错误?
答案 0 :(得分:6)
使用' ~
'作为主目录的缩写是一个shell的东西,并且不一定在C中可用。这可能会导致fopen
失败,并且您不会检查返回代码。 / p>
答案 1 :(得分:2)
您必须从不无法检查不受您控制的100%操作中的错误。如果您不知道文件是否存在且打开操作是否必须成功(这是您确实无法确定的事情),那么您必须测试:
FILE * f = fopen(log_file, "a");
if (!f) { /*error, die? */ }
fprintf(f, buffer);
还要确保buffer
是指向以null结尾的字符数组的第一个字符的有效指针,并且该字符串不包含任何格式说明符。
仅打印原始字符串str
,如果必须,可以更安全地使用fputs(str, f)
或fprintf(f, "%s", str)
。
答案 2 :(得分:0)
检查缓冲区的内容。您有未转义的%符号和/或没有空终止字符。
答案 3 :(得分:0)
据推测fopen
失败&返回NULL
指针。
您应该在使用之前检查fopen
的返回值,并使用errno
来确定错误是什么。