SPARC arcitecture中的C++总线错误

PJT*_*PJT 0 c++ bus-error

我想了解为什么我在使用此代码时出现总线错误.

int main()
{
int p=34;
int *pp= (int *) ((char *)&p+1);
cout<<*pp<<"\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 10

毫无疑问,这是一个对齐问题.在许多体系结构中,某些类型必须正确对齐,例如4字节整数必须在4字节边界上开始.

如果您访问非对齐数据,某些体系结构将无关紧要,其他体系结构将运行速度较慢,而其他体系结构(例如在这种情况下)将陷入尖叫堆中.

当您创建的整数p,它将被正确地在堆栈上的这是一个正确的倍数的地址一致.

通过在字节上移动该地址,并将其取消引用int,您将导致该地址SIGBUS.

Oracle上的此链接显示了对齐要求.简而言之:

  • 短整数在16位边界上对齐.
  • int整数在32位边界上对齐.
  • 对于SPARC系统,长整数在64位边界上对齐.
  • 长整数在64位边界上对齐.