由于内存地址未对齐,内存地址可能会损坏? [关闭]

问题描述 投票:0回答:1

因此,当我尝试访问此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
c++ c memory-management mips memory-address
1个回答
4
投票

我怀疑您正在看到未定义行为的结果。您的一个错误指针很可能导致您的程序指向不相关数据的页面,调试器试图将其视为有意义的,好像它包含有效的数据结构,但是由于没有,所以调试器显示的是基于废话的值关于误解该位置is的无关数据的问题。

[尝试在不支持未对齐访问的CPU上取消引用未对齐/未对齐的地址通常会引起SIGBUS样式的陷阱。 (请注意,未对齐/未对齐的取消引用被视为未定义的行为,即使在CPU does支持它的x86之类的CPU上,在这种情况下,问题的症状也可能更加微妙,而不是导致您明显崩溃可能只会导致计算结果不正确,或者仅在某些CPU上崩溃,而在其他CPU上则不崩溃。

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

© www.soinside.com 2019 - 2024. All rights reserved.