首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将无符号int的指针传递给long int的指针

将无符号int的指针传递给long int的指针
EN

Stack Overflow用户
提问于 2015-04-17 15:04:57
回答 3查看 1.5K关注 0票数 1

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

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

代码语言:javascript
运行
复制
#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位,我已经尝试过了:

代码语言:javascript
运行
复制
#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);
}

它工作得很好,但我已经在整个应用程序中多次使用第一种方法。任何替代解决方案都将不胜感激。

EN

回答 3

Stack Overflow用户

发布于 2015-04-17 15:22:13

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

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

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

您的修复方法之所以有效,是因为您传递了一个指向类型正确的对象的指针,但是考虑到您的输入不能表示time_t可以表示的所有值。

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

票数 2
EN

Stack Overflow用户

发布于 2015-04-17 15:19:57

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2015-04-18 03:12:52

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29692455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档