sigbus内存错误

本文讨论了跨平台C++开发中ARM与x86架构下内存对齐问题,特别是非对齐内存访问引发的SIGBUS信号及具体错误类型如BUS_ADRALN。文章还提供了解决方案,例如使用memcpy进行逐字节复制。

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

编写跨平台代码时,ARM不支持非对齐的内存访问,x86支持,跨平台C++代码容易出现以下问题

sigbus意思是该地址有效,但是总线不能读取,具体错误信息有以下三种

191316_V8JB_1391394.png

BUS_ADRALN 未对齐的内存

BUS_ADRERR 不存在的物理地址

BUS_OBJERR 硬件错误

 

BUS_ADRALN 一般是类型转换导致的,比如

194336_mRT4_1391394.png

由于对齐,多出来的3个字节并没有初始化为0,ptr1按照int来解析内存,能顺利读取到后面3个字节,因为内存是合法的,虽然数据不对,但是对于没有对齐的话,那么按照ptr1的地址解析int 就会出错,因为虽然ptr1指针的地址是合法的,但是只有一个字节,并没有多出3个字节。如果CPU支持非对齐内存的访问的话,把3个字节当做0处理即可,但是部分ARM系列并不支持。这类代码编写跨平台就很容易BUG。

这种问题的解决方案之一是,用sizeof 和 char*最小的 基本数据内存块来对内存解析,

简单粗暴就是memcpy(..,..,sizeof(...));这样一个字节一个字节地拷贝到副本里面

 

又比如

202132_vMDK_1391394.png

 

 

 

转载于:https://my.oschina.net/kkkkkkkkkkkkk/blog/898929

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值