将unsigned int的指针传递给long int的指针

时间:2015-04-17 07:04:57

标签: c++ c pointers 64-bit 32bit-64bit

我有一个在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);
}

哪个工作正常,但我在我的整个应用程序中多次使用了第一种方法。任何替代解决方案将不胜感激。

3 个答案:

答案 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位