我在编写为OSX上的(我相信)Linux设计的代码时遇到错误。我已将问题跟踪到这部分代码:
TIMEVAL = time(NULL);
char* TIMESTRING = ctime(&TIMEVAL);
TIMESTRING[24]=' ';
fprintf(LOG, "[ %20s] ", TIMESTRING);
有什么理由可以这样吗?我收录了<time.h>
。
答案 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]=' ';
错误(即,您正在使用空格字符替换终止字符)并在以后阶段导致分段错误。