由于某种原因,我的代码抛出了段错误。我认为这与timeinfo变量的实际使用有关,但是我不太确定。我不知道为什么不使用该变量会引发seg错误,而使用它不会引发seg错误。
此代码将引发段错误:https://www.onlinegdb.com/Hk1JT-Ys4
#include <iostream>
#include <stdio.h>
#include <time.h>
#include <string.h>
using namespace std;
int main ()
{
string timeString = "3019-05-17T22:9:00Z";
char char_array[timeString.length() + 1];
strcpy(char_array, timeString.c_str());
struct tm * timeinfo;
strptime(char_array, "%Y-%m-%dT%H:%M:%S", timeinfo);
// time_t now = time(0);
// struct tm * gmtNow= gmtime(&now);
// if(mktime(timeinfo)>mktime(gmtNow))
// puts("yes");
// else
// puts("no");
char buffer [80];
strftime (buffer,80,"%Y-%m-%dT%H:%M:%S", timeinfo);
puts (buffer);
return 0;
}
此代码不会: https://onlinegdb.com/H10GTZYoV
#include <iostream>
#include <stdio.h>
#include <time.h>
#include <string.h>
using namespace std;
int main ()
{
string timeString = "3019-05-17T22:9:00Z";
char char_array[timeString.length() + 1];
strcpy(char_array, timeString.c_str());
struct tm * timeinfo;
strptime(char_array, "%Y-%m-%dT%H:%M:%S", timeinfo);
time_t now = time(0);
struct tm * gmtNow= gmtime(&now);
if(mktime(timeinfo)>mktime(gmtNow))
puts("yes");
else
puts("no");
char buffer [80];
strftime (buffer,80,"%Y-%m-%dT%H:%M:%S", timeinfo);
puts (buffer);
return 0;
}
这是另一个奇怪的情况: https://onlinegdb.com/rkOTCZKs4
答案 0 :(得分:3)
struct tm * timeinfo;
strptime(char_array, "%Y-%m-%dT%H:%M:%S", timeinfo);
timeinfo
是一个指针,但未初始化,导致未定义的行为。您很幸运,它没有擦拭硬盘。相反,它可能只是将日期写入内存中的随机字节。如果该内存发生是您应用的真实内存,那么您将得到奇怪的错误。如果该内存碰巧不是您的应用程序拥有的内存,则操作系统可能会使您的应用程序崩溃。
正确的方法是:
struct tm timeinfo;
memset(&timeinfo, 0, sizeof(struct tm));
strptime(char_array, "%Y-%m-%dT%H:%M:%S", &timeinfo);