我试图遍历每个都包含timeval结构的几个结构。我希望能够获取第一个日期并将其存储在START_DATE全局变量中。我还想保存上次迭代的结构的日期。我这样做是通过在END_DATE char *中节省每次迭代的时间来实现的。
我遇到的问题是,即使START_DATE = asctime(localtime(&curSec));仅被调用一次,START_TIME被循环的每次迭代覆盖。
这里有没有人可以指出的要点问题?无双关语。
//Global
char *START_DATE = NULL;
char *END_DATE = NULL;
int main(int argc, char *argv[]) {
//start while loop that gets a new header struct each loop
time_t curSec = (time_t)header->ts.tv_sec;
if (!START_DATE)
START_DATE = asctime(localtime(&curSec));
END_DATE = asctime(localtime(&curSec));
//end while loop
printf("Start Date: %s", START_DATE);
printf("End Date: %s", END_DATE);
}
最佳答案
参见asctime reference:
保存此字符串的数组由ctime和asctime函数静态分配和共享。每次调用其中一个函数时,此数组的内容都会被覆盖。asctime
始终返回相同的指针,该指针指向它所保存的内部缓冲区,因此START_DATE
和END_DATE
始终指向同一对象。
因此,每次调用该函数时,START_DATE
和END_DATE
都指向的字符串都会更改。
要获得不会被覆盖的字符串的副本,您将需要分配自己的缓冲区,并使用strncpy
(如果决定使用strcpy
而不是malloc(strlen(START_DATE) + 1)
或类似方法,则复制char buf[1024]
) 。