从Linux移植到OSX时,会出现时间和ctime错误

时间:2011-02-18 11:51:50

标签: c time segmentation-fault ctime

我在编写为OSX上的(我相信)Linux设计的代码时遇到错误。我已将问题跟踪到这部分代码:

TIMEVAL = time(NULL);
char* TIMESTRING = ctime(&TIMEVAL);
TIMESTRING[24]=' ';

fprintf(LOG, "[ %20s] ", TIMESTRING);

有什么理由可以这样吗?我收录了<time.h>

2 个答案:

答案 0 :(得分:4)

ctime正在使用一个特定大小的静态分配缓冲区,所以你的第一个问题是你在不知道大小的情况下附加到该字符串。

TIMESTRING[24]=' ';

如果缓冲区只有24个字节,这可能会导致自身的段错误。另一个原因可能是,如果零终止恰好在索引24处,您只是使字符串未终止,并且fprintf将继续读取,直到它到达内存时不允许读取,从而导致段错误。

如果要修改预先分配的缓冲区,请使用ctime_r,并确保缓冲区足够大以容纳数据,并在完成后将其终止。如果ctime_r不可用,请在修改之前对您自己的缓冲区执行strncpy

HTH

编辑

我不确定你要做什么,但假设您发布的代码是直接从您的应用程序中获取的,那么您可能实际上是想要这样做:

TIMEVAL = time(NULL);
char* TIMESTRING = ctime(&TIMEVAL);

fprintf(LOG, "[ %20s ] ", TIMESTRING);

也就是说,填充你的时间字符串。只需在格式化字符串中添加空格,而不是在时间字符串缓冲区中。

答案 1 :(得分:1)

以此为例,ctime返回 - Sat May 20 15:21:51 2010 ,这只是24个字符(即24个字节)。所以,你的数组索引从 0到23 开始。因此,在索引24处它具有终止字符。

因此,TIMESTRING[24]=' '; 错误(即,您正在使用空格字符替换终止字符)并在以后阶段导致分段错误。