从32位平台到64位平台

文章讲述了在将系统从32位移植到64位时遇到的问题,如Struct大小变化、危险的强制类型转换(尤其是U32指针)、以及函数返回值类型不匹配可能导致的内存访问错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近有系统从32位平台移植到64位平台。遇到了很多问题。这里简单的记录一下:

更大的Struct

很明显,当平台换成64位之后,struct就有可能按照8字节来对齐了。这就导致了Struct的大小会有一定的增大。特别是当struct中又包含有struct的时候。这就要小心我们是否有对数组的地址做类型的强制转换成struct。

危险的强制类型转换

在32位平台上,指针类型也是32位的。所以我们有可能会定义一个32位长度的变量,例如:U32类型。然后把这个U32类型的变量当做指针来用。但是在64位平台上,很显然,指针类型是64位的,这样的强制使用U32类型的变量当做指针来用的方法就不可行了。U32变量中保存的地址就是个错误的地址,只有低32位!宕机就很显然了。更加危险的是,这样的强制类型转换是在我们的代码中显式申明的,编译器不会给出Warning!很难找到所有这样的错误代码!

缺失的函数申明

我们的函数定义在不同的文件中,在使用的地方有的时候没有include头文件。这个时候编译器会给我们一个Warning。很多时候这样的Warning并不会造成太大的问题。但是在32位到64位的移植过程中,有一类问题会导致错误:如果这个函数返回的是个64位的值,例如指针。但是使用的地方没有申明,会发生什么呢?编译器会默认认为这个函数的返回值是个32位的值。所以在调用的地方只会返回32位。

设想一下,如果你的函数是返回一个指针,调用的地方也确实是给这个函数的返回值赋值给了一个指针类型的值,但是这个指针的值就是不对,他只有低32位有值,高32位为0!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值