所以,当我试图访问这个0x303030303a303030
地址时。我收到SIGBUS
错误。
"正常/有效"地址的类型如下:0xffc8613d68
。 所有的指针都是有效的,直到发生一些事情。
那么,指针是否由于"未对齐"的内存地址而损坏?
通常,"未对齐"内存地址的症状是什么? 表演后是什么样子?
我的案子发生在MIPS上。
entries = {
next = 0x36312e30382e3438,
prev = 0x3000300035322e31
}
nice_ptr = 0x303030303a303030,
imp_data= 0x30303a303030303a <error: Cannot access memory at address 0x30303a303030303a>,
nimp_data= 0x323030303a3130
我怀疑你看到了未定义行为的结果。 很可能你的一个错误指针导致你的程序指向一个不相关的数据页面,你的调试器试图理解这些数据,就好像它包含一个有效的数据结构,但由于它没有,你的调试器正在根据错误解释该位置的不相关数据显示无意义的值。
尝试取消引用不支持未对齐访问的 CPU 上的未对齐/未对齐地址通常会导致引发 SIGBUS 样式陷阱。 (请注意,即使在 CPU 支持它的 x86 等 CPU 上,未对齐/未对齐的取消引用也被认为是未定义的行为,在这种情况下,问题的症状可能更加微妙,因为不是明显的崩溃,您可能最终只会得到不正确的计算结果,或者仅在某些 CPU 上崩溃,而在其他 CPU 上没有崩溃(。
所以简短的回答是:不要取消引用未对齐的指针(或者如果必须,一定要将它们强制转换为const char *
或类似的东西,以便编译器可以做必要的事情来允许这种访问 - 并且要非常小心你用这个指针做什么(。 如果您需要将未对齐的数据(例如,从网络数据包或加载的二进制文件(复制到对齐的int
或float
或其他任何内容中,请通过以下方式进行:memcpy(&myFloat, my_unaligned_char_ptr, sizeof(myFloat));
,而不是通过未对齐的 int/float/etc 指针和赋值运算符。memcpy()
将正确处理未对齐的取消引用,但=
不会。