2012-02-25 76 views
2

我得到一个分段错误,并使用gdb和backtrace,它被引发到vprintf。分割故障回溯到vfprintf?

#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从不同的目录中处理文件?会有人知道为什么它会在这里发生故障吗?

回答

6

使用'~'作为您的主目录的缩写是shell的东西,并不一定在C中可用。这可能会导致fopen失败,并且您不检查返回码。

0

检查缓冲区的内容。您有一个未转义的%符号和/或没有空终止字符。

0

大概fopen失败&返回一个NULL指针。

在使用前您应该检查返回值fopen,并使用errno来确定错误是什么。

2

您必须从不未能检查在您的控制下不是100%的操作中的错误。如果您不知道文件是否存在,并打开操作必须成功(这件事情你真的不能肯定知道,曾经),您必须测试:

FILE * f = fopen(log_file, "a"); 

if (!f) { /*error, die? */ } 

fprintf(f, buffer); 

另外,还要确保buffer是一个有效的指针到以空字符结尾的数组的第一个字符,并且该字符串不包含任何格式说明符。

对于仅打印原始字符串str,如果必须使用fputs(str, f)fprintf(f, "%s", str)更安全。