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)
从注释上来看,是开启了内存对齐检查功能,莫非我使用的系统默认在运行时没有开启该功能?
如果有了解的朋友,请帮忙解释下,多谢~~