c - 从 Linux 移植到 OSX 时,时间和 ctime 出现段错误

标签 c time segmentation-fault ctime

我在编译为(我相信)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/

相关文章:

c - 直接将 char *nib 转换为 int hex

用gcc编译C文件得到x86汇编代码

sqlite - SQLite纪元时间(以毫秒为单位)

c - 将输入字符串放入数组并按字母顺序对字符串数组进行排序

c++ - 将 *argv[] 中的偶数/奇数元素添加到数组

c - 从动态数组 C 中删除元素

r - 日期、时区和 POSIXct

linux - 在 Linux 中更改 "time"命令的分辨率

c - 由于 malloc 导致段错误

c++ - 改变其他静态库使用的静态库