我有一个在32位系统中正常工作的示例代码,但是当我为64位系统交叉编译并尝试在64位系统上运行时,它的行为有所不同。
谁能告诉我为什么会这样?
#include <usr/include/time.h>
#include <sys/time.h>
void func(time_t * inputArg)
{
printf("%ld\n",*inputArg);
}
int main()
{
unsigned int input = 123456;
func((time_t *)&input);
}
这里“time_t”是linux系统库头文件中定义的类型,类型为“long int”。 这段代码适用于32位系统,但不适用于64位。
对于64位我试过这个:
#include <usr/include/time.h>
#include <sys/time.h>
void func(time_t * inputArg)
{
printf("%ld\n",*inputArg);
}
int main()
{
unsigned int input = 123456;
time_t tempVar = (time_t)input
func(&tempVar);
}
哪个工作正常,但我在我的整个应用程序中多次使用了第一种方法。任何替代解决方案将不胜感激。
答案 0 :(得分:2)
谁能告诉我为什么会这样?
取消引用大小与指向对象类型不同的整数指针具有未定义的行为。
如果指向的整数小于指针指向的类型,则将读取不相关的字节作为解除引用的数字的一部分。
您的修复可行,因为您将指针传递给了正确类型的对象,但请注意您的输入不能代表time_t
可以的所有值。
最好的解决方法是最初使用正确的类型。使用time_t
作为输入。
答案 1 :(得分:0)
您的“修复”代码具有强制转换功能,可让编译器将您的unsigned int
值转换为time_t
。您的原始代码假定它们是相同的。
在你的32位系统上,它们完全相同,所以你很幸运。在64位系统上,您可以找到调用未定义行为时会发生什么。
换句话说,C和C ++都允许你指向你想要的任何指针,但是你应该确保这些强制转换是安全的。
答案 2 :(得分:0)
谢谢你的回复。 实际上,当我在32位机器和64位机器上打印sizeof'long int'时,我发现了我的错误。
32位机器:
sizeof(int)= 32bit&amp; sizeof(long int)= 32 bit&amp; sizeof(long long int)= 64 bit
64位机器:
sizeof(int)= 32bit&amp; sizeof(long int)= 64 bit&amp; sizeof(long long int)= 64位