内存地址是否由于未对齐的内存地址而损坏?

Could memory addresses be corrupted, because of unaligned memory address?

本文关键字:内存 地址 损坏 于未 是否 对齐      更新时间:2023-10-16

所以,当我试图访问这个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 *或类似的东西,以便编译器可以做必要的事情来允许这种访问 - 并且要非常小心你用这个指针做什么(。 如果您需要将未对齐的数据(例如,从网络数据包或加载的二进制文件(复制到对齐的intfloat或其他任何内容中,请通过以下方式进行:memcpy(&myFloat, my_unaligned_char_ptr, sizeof(myFloat));,而不是通过未对齐的 int/float/etc 指针和赋值运算符。memcpy()将正确处理未对齐的取消引用,但=不会。