strptime()导致EXC_BAD_ACCESS

时间:2017-07-11 21:54:23

标签: c date time strptime

我尝试使用tm函数将字符串解析为strptime()结构。

int main(int argc, const char * argv[]) {
    char raw_date1[100];
    char date1[100];
    struct tm *timedata1 = 0;

    printf("please provide the first date:");
    fgets(raw_date1, sizeof(raw_date1), stdin);

    strip_newline(date1, raw_date1, sizeof(raw_date1));

    char format1[50] = "%d-%m-%Y";

    strptime(date1, format1, timedata1);

在最后一行,程序崩溃并显示以下消息:EXC_BAD_ACCESS (code=1, address=0x20)

为什么呢?

一些额外信息:根据调试程序,在崩溃时,date123/23/2323format1"%d-%m-%Y"timedata1为{ {1}}。

2 个答案:

答案 0 :(得分:0)

在您的代码中:

struct tm *timedata1 = 0;

相同
struct tm *timedata1 = NULL;

因此,陈述

strptime(date1, format1, timedata1);

相同
strptime(date1, format1, NULL);

即,在您的代码中,您将NULL作为参数传递给strptime,这将取消引用指针并产生未定义的行为/错误访问。

所以你应该写下面的内容:

struct tm timedata1 = {0};
strptime(date1, format1, &timedata1);

答案 1 :(得分:0)

您正在将空指针传递给strptime()作为目标tm结构。这有未定义的行为。您应该将指针传递给定义为局部变量的tm结构:

#include <stdio.h>
#include <time.h>

int main(int argc, const char *argv[]) {
    char raw_date1[100];
    char date1[100];
    struct tm timedata1;

    printf("please provide the first date:");
    if (fgets(raw_date1, sizeof(raw_date1), stdin)) {
        strip_newline(date1, raw_date1, sizeof(raw_date1));

        char format1[50] = "%d-%m-%Y";

        strptime(date1, format1, &timedata1);

        ...
    }
    return 0;
}

请注意strptime不是标准的C函数,尽管它作为POSIX-1.2001的一部分广泛使用。