我在编译为(我相信)OSX 上的 Linux 设计的代码时遇到错误。我已将问题追踪到这部分代码:
TIMEVAL = time(NULL);
char* TIMESTRING = ctime(&TIMEVAL);
TIMESTRING[24]=' ';
fprintf(LOG, "[ %20s] ", TIMESTRING);
有什么理由会出现这种情况吗?我已经包括<time.h>
.
我在编译为(我相信)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
在修改之前对自己的缓冲区执行操作。
高温高压
编辑
我不确定您到底要做什么,但假设您发布的代码是直接从您的应用程序中获取的,那么您实际上可能希望这样做:
TIMEVAL = time(NULL);
char* TIMESTRING = ctime(&TIMEVAL);
fprintf(LOG, "[ %20s ] ", TIMESTRING);
也就是说,填充您的时间字符串。只需在格式字符串中添加空格,而不是在时间字符串缓冲区中。
以此为例,ctime 返回的内容 - Sat May 20 15:21:51 2010只有 24 个字符(即 24 个字节)。因此,您的数组索引从0 到 23开始。因此,在索引 24 处,它具有终止字符。
所以,TIMESTRING[24]=' ';
是错误的(即,您正在用空格字符替换终止字符)并且导致您在后期阶段出现分段错误。