1

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

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

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

有什么理由会出现这种情况吗?我已经包括<time.h>.

4

2 回答 2

4

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

TIMESTRING[24]=' ';

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

如果要修改它,请与预分配缓冲区一起使用ctime_r,并确保缓冲区足够大以容纳您的数据,并在完成后以零结尾。如果ctime_r不可用,请strncpy在修改之前对自己的缓冲区执行操作。

高温高压

编辑

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

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

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

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

于 2011-02-18T11:58:00.443 回答
1

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

所以,TIMESTRING[24]=' ';错误的(即,您正在用空格字符替换终止字符)并且导致您在后期阶段出现分段错误。

于 2011-02-18T12:01:07.873 回答