关于总线错误
<<C专家编程>> 157页
事实上,总线错误几乎都是由于未对齐的内存访问引起的。它之所以称为总线错误,是因为出现未对齐的内存访问请求时,被堵塞的组件就是 地址总线。 alignment的意思就是数据项 只能存储在地址是数据项大小的整数倍的内存位置上。
通过迫使每个内存访问 局限在 一个cache行 或者 一个单独的页面内,以及极大地简化并加速如cache控制器和内存管理单元这样的硬件。
union { char a[10];
int i;
}u;
int *p = (int *)&(u.a[1]);
*p = 17; /* p中未对齐的地址会引起一个总线错误 */
因为 数组和 int的联合 确保 数组a是按照int的4字节对齐,所以’a+1‘ 的地址肯定未按int对齐。
我们试图往这地址存储4个字节的数据,但这个访问只是按照单字节的char对齐....
把一个char指针转换为int指针很容易导致神秘的总线错误
我自己在VC6.0里面试了一下.
没有报错吧...
高手请给指出
我的源码:
#include "stdafx.h"
union {
char a[10];
int n;
int main(int argc, char* argv[])
{
int *p = (int *)&uniontest.a[1];
*p=17;
return 0;
}