由于未对齐的内存地址,内存地址是否会被破坏?

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

所以,当我试图访问这个 0x303030303a303030 地址时。我收到 SIGBUS 错误。

"Normal/valid" 地址类型如下:0xffc8613d68。 并且所有指针都是有效的,直到发生某些事情。

那么,指针是否因为 "unaligned" 内存地址而损坏?

一般来说,"unaligned" 内存地址的症状是什么? 演出后的样子?

我的案例发生在 MIPS 上。

entries = {
     next = 0x36312e30382e3438, 
     prev = 0x3000300035322e31
  }
  nice_ptr = 0x303030303a303030, 
  imp_data= 0x30303a303030303a <error: Cannot access memory at address 0x30303a303030303a>, 
  nimp_data= 0x323030303a3130

我怀疑您看到的是未定义行为的结果。很可能你的一个错误指针导致你的程序指向一页不相关的数据,你的调试器试图理解它是否包含有效的数据结构,但由于它没有,你的调试器显示无意义的值基于关于误解 在该位置 的不相关数据。

尝试取消引用 CPU 上不支持未对齐访问的 unaligned/misaligned 地址通常会引发 SIGBUS 样式的陷阱。 (请注意,即使在像 x86 这样的 CPU 上,unaligned/misaligned 取消引用也被认为是未定义的行为,其中 CPU 确实 支持它,在这种情况下问题的症状可能要微妙得多,因为您可能最终得到的计算结果不正确,而不是明显的崩溃,或者仅在某些 CPU 上崩溃,而在其他

上不崩溃。

所以简短的回答是:不要取消引用未对齐的指针(或者如果必须,请确保将它们转换为 const char * 或类似的,以便编译器可以执行允许此类访问所需的操作- 并且要非常小心你用那个指针做什么)。如果您需要将未对齐的数据(例如,从网络数据包或加载的二进制文件)复制到对齐的 intfloat 或其他任何内容,请通过例如memcpy(&myFloat, my_unaligned_char_ptr, sizeof(myFloat)); 而不是通过未对齐的 int/float/etc 指针和赋值运算符。 memcpy() 将正确处理未对齐的取消引用,但 = 不会。