将无符号 int 的指针传递到长 int 的指针

Passing pointer of unsigned int to pointer of long int

本文关键字:int 指针 无符号      更新时间:2023-10-16

我有一个在 32 位系统中正常工作的示例代码,但是当我为 64 位系统交叉编译它并尝试在 64 位机器上运行时,它的行为有所不同。

谁能告诉我为什么会这样?

#include <usr/include/time.h>
#include <sys/time.h>
void func(time_t * inputArg)
{
   printf("%ldn",*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("%ldn",*inputArg);
}
int main()
{
   unsigned int input  = 123456;
   time_t tempVar = (time_t)input
   func(&tempVar);
}

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

谁能告诉我为什么会这样?

取消引用大小与指向对象类型不同的整数指针具有未定义的行为。

如果指向整数小于指针指向类型,则将读取不相关的字节作为取消引用数字的一部分。

您的

修复有效,因为您将指针传递给正确类型的对象,但请考虑您的输入无法表示time_t可以表示的所有值。

最好的解决方法是最初使用正确的类型。使用time_t作为输入。

您的"固定"代码有一个强制转换,允许编译器将您的unsigned int值转换为time_t。原始代码假定它们是相同的。

在您的 32 位系统上,它们是相同的,所以你很幸运。在 64 位系统上,您可以了解调用未定义行为时会发生什么。

换句话说,C 和 C++ 都允许您将指针投射到您想要的任何内容,但由您来确保此类强制转换是安全的。

感谢您的回复。实际上,当我在 32 位机器和 64 位机器中打印"long int"的大小时,我发现了我的错误。

32位机器:sizeof(int) = 32bit & sizeof(long int) = 32 bit & sizeof(long long int) = 64 bit
64位机器:sizeof(int) = 32bit & sizeof(long int) = 64 bit & sizeof(long long int) = 64 bit