首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ctime随机返回NULL

ctime随机返回NULL
EN

Stack Overflow用户
提问于 2016-10-22 06:38:48
回答 2查看 222关注 0票数 0

我正在使用ctime。但是,它总是返回NULL。所以它的核心是sprintf行。它早些时候起作用了。所以不确定为什么它会随机返回NULL?

我有以下代码片段:

代码语言:javascript
复制
int main()
{
    char avp_val[50];

    uint32_t date_value=1477069401;

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

    return;
}
EN

回答 2

Stack Overflow用户

发布于 2016-10-22 06:43:15

不要将指向uint32_t的指针转换为time_t。使用实际的time_t,因此在使用64位time_t的系统上,ctime不会在纪元时间内读取四个字节的垃圾:

代码语言:javascript
复制
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*)以使编译器警告静默可以使警告静默,但这并没有解决问题。

票数 5
EN

Stack Overflow用户

发布于 2016-10-25 13:27:01

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

代码语言:javascript
复制
#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返回一个显式的值。不这样做是一个编译错误,因此您的示例无法执行,因为它不能编译(因此,您无法从ctime(3)接收NULL )

顺便说一下,我在mac /X上用uint32_t date_value测试了你的代码,它打印了正确的时间值,所以time_t可能是一个32位的值,但你最好使用time_t,因为它是由这个原因定义的。

注1

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40186372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档