关于总线错误

wenchanyee 2007-06-06 07:36:57
<<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;
}
...全文
422 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
mihu525 2011-04-09
  • 打赏
  • 举报
回复
我的也是总线错误 不过好像没你那个问题阿
AnYidan 2011-04-09
  • 打赏
  • 举报
回复
正在看,还没看到,但有一点,此书的语法专门对 ansi c, lz 的 vc 采用的 microsoft 的标准,不太一样

另外,有些缺陷在后来可能作了补救,毕竟是一本老书了
wenchanyee 2007-06-07
  • 打赏
  • 举报
回复
好像是你说的那么回事情.
不过我也不太确定
huashizhixin 2007-06-06
  • 打赏
  • 举报
回复
好象这个和cpu处理器类型有关吧,
有的是big_End,有的是Little_End,默认是后者.
在嵌入式里面因为cpu不同涉及地址对齐问题,好象pc机上不用考虑这个.
wenchanyee 2007-06-06
  • 打赏
  • 举报
回复
自己顶一个........

69,335

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧