我正在使用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;
}发布于 2016-10-22 06:43:15
不要将指向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*)以使编译器警告静默可以使警告静默,但这并没有解决问题。
发布于 2016-10-25 13:27:01
好吧,你的代码缺少一堆包含文件:
#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示例,因为您可以通过编辑要显示的示例来隐藏错误的确切来源。
https://stackoverflow.com/questions/40186372
复制相似问题