奇怪的赛格断层

时间:2019-05-03 00:43:54

标签: c++ strptime

由于某种原因,我的代码抛出了段错误。我认为这与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

1 个答案:

答案 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);