bus error

TODD911 2013-04-17 12:58:08
在《C专家编程》中还给出了总线错误(bus error)的例子:
[cpp] view plaincopy
union
{
char a[10];
int i;
}u;

int *p =(int*)&(u.a[1]);

*p =17;/*p中未对齐的地址将会引起总线错误,因为数组和int的联合确保了a是按照int的4字节来对齐的,所以“a+1”肯定不是int来对齐的。*/

但是在实际的运行中并没有出现该错误,我的环境是CentOS release 6.2,2.6.32-279.14.1.el6.i686,gcc 4.4.6
后来在网上参考了一个sample程序,将程序修改为如下:
[cpp] view plaincopy
#include <stdlib.h>

int main(int argc, char **argv) {

#if defined(__GNUC__)
# if defined(__i386__)
/* Enable Alignment Checking on x86 */
__asm__("pushf\norl $0x40000,(%esp)\npopf");
# elif defined(__x86_64__)
/* Enable Alignment Checking on x86_64 */
__asm__("pushf\norl $0x40000,(%rsp)\npopf");
# endif
#endif

union{
char a[10];
int i;
}u;

int *p =(int*)&(u.a[1]);
*p =17;
}

运行结果如下:
Bus error (core dumped)
从注释上来看,是开启了内存对齐检查功能,莫非我使用的系统默认在运行时没有开启该功能?
如果有了解的朋友,请帮忙解释下,多谢~~
...全文
404 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
TODD911 2013-04-17
  • 打赏
  • 举报
回复
引用 4 楼 Athenacle_ 的回复:
x86计算机上不会有总线错误
多谢指点~
Athenacle_ 2013-04-17
  • 打赏
  • 举报
回复
x86计算机上不会有总线错误
TODD911 2013-04-17
  • 打赏
  • 举报
回复
引用 2 楼 adlay 的回复:
默认如果没有对齐的话, 只是访问速度会降低. 读一个 int 本来只读一次的, 要读 2 次才行.
用了error这个词,感觉是很严重的错误。。。
www_adintr_com 2013-04-17
  • 打赏
  • 举报
回复
默认如果没有对齐的话, 只是访问速度会降低. 读一个 int 本来只读一次的, 要读 2 次才行.
TODD911 2013-04-17
  • 打赏
  • 举报
回复
没人回答吗?

69,372

社区成员

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

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