ctime随机返回NULL

时间:2016-10-21 22:38:48

标签: c datetime

我正在使用ctime。但是它总是返回NULL。所以它在sprintf线上核心。它工作得更早。所以不确定为什么它会随机返回NULL?

我有以下代码段:

int main()
{
    char avp_val[50];

    uint32_t date_value=1477069401;

    sprintf(avp_val,"%s",ctime((time_t*)(&date_value)));

    return;
}

2 个答案:

答案 0 :(得分:5)

不要将指针uint32_t投射到time_t。使用实际的time_t,因此64位time_t ctime的系统不会读取四个字节的垃圾作为纪元时间的一部分:

int main()
{
    char avp_val[50];

    time_t date_value=1477069401;

    sprintf(avp_val,"%s",ctime(&date_value));
    // Or, because it's what you're doing anyway, skip sprintf:
    // strcpy(avp_val, ctime(&date_value));

    return 0;
}

投射到(time_t*)以使编译器警告静音,使警告无效,但它没有解决问题。

答案 1 :(得分:0)

好吧,你的代码缺少一堆包含文件:

#include <stdlib.h>  /* for the types you use below, like uint32_t */
#include <stdio.h>  /* for a prototype for sprintf, which you use below */
#include <time.h> /* for a prototype for ctime() see NOTE 1 */

您还必须考虑到必须使用数据值而不是指针来完成转换,因为转换指针只会绕过编译器类型检查系统并使代码更容易出错。在这种情况下,如果两种类型的大小不同,则从uint32_t *转换为time_t *会非常危险,因为您只需使用一半所需的位来切割值。这就是未定义的行为,你应该避免它。

您还必须从main返回显式值。这是一个编译错误,不这样做,因此你的例子无法执行,因为它不能编译(因此,你无法从NULL接收ctime(3)

顺便说一句,我在mac OS / X中使用uint32_t date_value尝试了你的代码并且它打印了正确的时间值,所以time_t可能是32位值,但你最好是使用time_t,因为它是由此原因定义的。

注1

在这种情况下最重要的是ctime()的原型,它返回一个指向char的指针而没有原型,编译器假定它返回int。至少在64位平台中,两种类型都有不同的大小,不能通过这种方式传递。

请始终发布Complete, minimum, verifiable示例,因为您可以通过编辑要显示的示例来隐藏错误的确切来源。