gmtime_r的奇怪行为

时间:2017-02-28 21:07:27

标签: c gcc time

int main() {
    time_t *ptr;
    struct tm *dates;
    time(ptr);
    gmtime_r(ptr, dates);
    size_t a = 20; //<-- works with int
    return 0;
}

失败,出现Segmentation fault (core dumped)错误。当我使用int代替size_t时,一切正常。当我将gmtime_r更改为非线程安全gmtime时,它也可以工作,但我必须添加gmtime将指定的指针声明。 Declaration of gmtime_r

gcc版本是5.4.0,用gcc -Wall -o a test.c编译,64位ubuntu。

2 个答案:

答案 0 :(得分:1)

一点都不奇怪;您需要分配dates个点,因此gmtime_r可以填充它。 ptr指向的是什么,因此time可以填补此内容。

答案 1 :(得分:1)

C中的指针就是这样,它们确定了数据可能存在的位置(或者可能不存在,在这种情况下,未定义的行为是规则)。

int main() {
    time_t ptr; // Actual storage for time_t
    struct tm dates; // Actual storage for struct tm
    time(&ptr); // Pointer to a time_t
    gmtime_r(&ptr, &dates); // Pointer to a time_t, pointer to a
    // struct tm
    size_t a = 20; //<-- works with int
    return 0;
}