(1)总线错误:
书上的一段程序:
union { char a[10];
int i;
}u;
int *p = (int *)&(u.a[1]);
*p = 17;
书上是说,这段代码会引发总线错误(bus error),但是我不论在ubuntu Linux上调试还是在Window XP(TC)中调试,均未有报错。后来在网上搜索,很多人提到是因为SUN操作系统的原因。
摘录一点书上关于总线错误的描述:
总线错误几乎都是由未对齐的读或写引起的。它之所以称为总线错误,是因为出现未对齐的内存访问请求时,被阻塞的组件就是地址总线。对齐(alignment)的意思就是数据项只能存储在地址是数据项大小的整数倍的内存位置上。在现代的计算机架构中,尤其是RSIC架构,都需要数据对齐,因为与任意的对齐有关的额外操作会是整个内存系统更大更缓慢。通过迫使每个内存访问局限在一个Cache行或一个单独的页面内,可以极大的简化(并加速)如Cache控制器和内存管理单元这样的硬件。
我们表达“数据项不能跨越页面或Cache边界”的规则的方法多少有些间接,因为我们用地址对齐这个术语陈述这个问题。页和Cache的大小是经过精心设计的,这样只要遵循对齐规则就可以保证一个原子数据项不会跨越一个页或Cache块的边界。
(2)段错误:
还是书上的程序:
int *p = 0;
*p = 17;
这个程序在Windows XP(TC)下,把这个程序改成了:
int *p = 0;
printf("p指向的地址: 0x%X\n",p);
*p = 17;
printf("p的地址: 0x%X\n",&p);
printf("p指向的地址: 0x%X\n",p);
printf("p指向地址中存储的值 %d\n",*p);
执行结果:
0x0000
0xFFDE
0x0000
17
Null pointer assignment
我还以为在*p = 17;之后p指向的地址会变化的,其实根本就没有修改p的指向啊,疑问,这个p的指向正确吗?
阅读(1201) | 评论(1) | 转发(0) |