我在编译为(我相信)OSX 上的 Linux 设计的代码时遇到错误。我已将问题追查到这部分代码:
TIMEVAL = time(NULL);
char* TIMESTRING = ctime(&TIMEVAL);
TIMESTRING[24]=' ';
fprintf(LOG, "[ %20s] ", TIMESTRING);
为什么会出现这种情况?我已经包含了<time.h>
.
最佳答案
ctime
使用特定大小的静态分配缓冲区,因此您的第一个问题是您在不知道大小的情况下附加到该字符串。
TIMESTRING[24]=' ';
如果缓冲区只有 24 字节,这可能会导致它自己的段错误。另一个原因可能是如果零终止恰好在索引 24 处,您只是使字符串未终止,并且 fprintf
将继续读取直到它遇到不允许读取的内存,从而导致段错误。
如果要修改缓冲区,请将 ctime_r
与预分配缓冲区一起使用,并确保缓冲区足够大以容纳您的数据,并且在完成后以零终止。如果 ctime_r
不可用,请在修改之前对您自己的缓冲区执行 strncpy
。
HTH
编辑
我不确定你到底想做什么,但假设你发布的代码是直接从你的应用程序中获取的,你可能真的想这样做:
TIMEVAL = time(NULL);
char* TIMESTRING = ctime(&TIMEVAL);
fprintf(LOG, "[ %20s ] ", TIMESTRING);
也就是说,填充你的时间字符串。只需在格式化字符串中添加空格,而不是在时间字符串缓冲区中。
关于c - 从 Linux 移植到 OSX 时,时间和 ctime 出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5040950/