我想了解为什么我在使用此代码时出现总线错误。
int main()
{
int p=34;
int *pp= (int *) ((char *)&p+1);
cout<<*pp<<"\n";
return 0;
}
答案 0 :(得分:10)
毫无疑问,这是一个对齐问题。在许多体系结构中,某些类型必须正确对齐,例如,4字节整数必须从4字节边界开始。
如果您访问非对齐数据,某些体系结构将无关紧要,其他体系结构将运行速度较慢,而其他体系结构(例如在这种情况下)将落入尖叫堆中。
当创建整数p
时,它将在堆栈上正确对齐,地址是正确的倍数。
通过在字节上移动该地址并将其取消引用为int
,您将导致SIGBUS
。
This link显示了对齐要求。简而言之:
答案 1 :(得分:1)
16位数量必须以16位或2字节对齐方式存储,32位(4字节)存储在地址为4的倍数。
许多CPU支持未对齐访问,但它在芯片中需要额外的电路,并且需要额外的执行时间来运行额外的内存总线周期以获取奇数字节。这是一种特别常见的RISC处理器理念,要求编译器和程序员更加谨慎地布置数据以提高速度和简化电路是一种可接受的权衡。
顺便说一句,这样的低地址不太可能在有效的内存中。但是您的示例确实说明了对齐异常优先于SEGFAULT异常。