将无符号 int 的指针传递到长 int 的指针
Passing pointer of unsigned int to pointer of 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;
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
- 如何将 int 指针转换为浮点指针
- 使用 int 指针的浮点数的位表示形式
- 引用数据的 int 指针
- 为什么我不能像这样直接将 int 分配给 int 指针:int *p = 6;?
- 为什么可以将Char指针变量初始化为字符串,而INT指针变量不能初始化到整数数组
- 将 Int 指针分配给双精度变量
- 如何使用函数参数中的int指针来获取2d数组中最大值的索引并返回指针
- 为什么在int指针的const vetory中脱离了元素
- (C++)通过指针递增,或者:为什么这不起作用?指针->int = 指针->int+1;
- 如何在 C++ 中将浮点指针转换为 int 指针
- 循环中的 int C++指针?
- 当我创建一个int指针并实例化一个数组时,数组在内存中发生了什么
- 将字符阵列转换为INT指针
- 施放INT指针时编译错误
- 如何返回一个 int 指针,指向矢量<int>的开头
- 64位计算机上的int大小和int指针大小
- 如何将 void 指针类型转换为 int 指针,然后在其中存储 int
- 取消对结构的 int 指针地址的引用
- 通过"int *"指针更改"const int"。令人惊讶和有趣
- C/C++ int[] vs int*(指针与数组表示法).有什么区别