我试图遍历每个都包含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_DATEEND_DATE始终指向同一对象。

因此,每次调用该函数时,START_DATEEND_DATE都指向的字符串都会更改。

要获得不会被覆盖的字符串的副本,您将需要分配自己的缓冲区,并使用strncpy(如果决定使用strcpy而不是malloc(strlen(START_DATE) + 1)或类似方法,则复制char buf[1024]) 。

08-25 07:28