sigbus内存错误
编写跨平台代码时,ARM不支持非对齐的内存访问,x86支持,跨平台C++代码容易出现以下问题
sigbus意思是该地址有效,但是总线不能读取,具体错误信息有以下三种
BUS_ADRALN 未对齐的内存
BUS_ADRERR 不存在的物理地址
BUS_OBJERR 硬件错误
BUS_ADRALN 一般是类型转换导致的,比如
由于对齐,多出来的3个字节并没有初始化为0,ptr1按照int来解析内存,能顺利读取到后面3个字节,因为内存是合法的,虽然数据不对,但是对于没有对齐的话,那么按照ptr1的地址解析int 就会出错,因为虽然ptr1指针的地址是合法的,但是只有一个字节,并没有多出3个字节。如果CPU支持非对齐内存的访问的话,把3个字节当做0处理即可,但是部分ARM系列并不支持。这类代码编写跨平台就很容易BUG。
这种问题的解决方案之一是,用sizeof 和 char*最小的 基本数据内存块来对内存解析,
简单粗暴就是memcpy(..,..,sizeof(…));这样一个字节一个字节地拷贝到副本里面
又比如