首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

bus error,该怎么处理

2013-04-20 
bus error在《C专家编程》中还给出了总线错误(bus error)的例子:[cpp] view plaincopyunion{char a[10]int

bus error
在《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)
从注释上来看,是开启了内存对齐检查功能,莫非我使用的系统默认在运行时没有开启该功能?
如果有了解的朋友,请帮忙解释下,多谢~~ C alignment 编程
[解决办法]
默认如果没有对齐的话, 只是访问速度会降低. 读一个 int 本来只读一次的, 要读 2 次才行.
[解决办法]
x86计算机上不会有总线错误

热点排行