因此,当我尝试访问此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
我怀疑您正在看到未定义行为的结果。您的一个错误指针很可能导致您的程序指向不相关数据的页面,调试器试图将其视为有意义的,好像它包含有效的数据结构,但是由于没有,所以调试器显示的是基于废话的值关于误解该位置is的无关数据的问题。
[尝试在不支持未对齐访问的CPU上取消引用未对齐/未对齐的地址通常会引起SIGBUS样式的陷阱。 (请注意,未对齐/未对齐的取消引用被视为未定义的行为,即使在CPU does支持它的x86之类的CPU上,在这种情况下,问题的症状也可能更加微妙,而不是导致您明显崩溃可能只会导致计算结果不正确,或者仅在某些CPU上崩溃,而在其他CPU上则不崩溃。
因此简短的答案是:不要取消引用未对齐的指针(或者,如果必须,请确保将它们强制转换为const char *
或类似的名称,以便编译器可以执行允许这种访问的必要操作-并且非常请谨慎处理该指针)。如果您需要将未对齐的数据(例如从网络数据包或加载的二进制文件中)复制到对齐的int
或float
或其他内容中,请通过例如memcpy(&myFloat, my_unaligned_char_ptr, sizeof(myFloat));
而不是通过未对齐的int / float / etc指针和赋值运算符。 memcpy()
将正确处理未对齐的取消引用,但=
将不会。