也是从公开课学到的,作了些笔记,现在在实习的机房,靠回忆顺便和大家分享,笔记在宿舍的电脑里,回去再补上。
seg failure:
bus failure: (这个我不清楚,网上也查了些资料,不怎么清楚)
一个程序:
void foo()
{
int i;
int array[4];
for(i=0;i<=4;++i)
array[i]=0;
}
这段程序会一直无限循环,因为array[4]的地址和i的地址一样的,也就是当第四次循环后,i=3,然后循环执行,++i;即array[4]=0即把 i 地址处的值为4覆盖成为0。
然后执行++i,成功又执行,一样这样下去。其实这造成了缓冲区溢出了。
在栈中,地址是由高往低增长的,那么i的地址(即array[4]的地址)在array[3]上面,array[0]在最下面。可以自己测试打印出他们的地址。
另一个:
void foo()
{
int i;
short array[4];
for(i=0;i<=4;++i)
array[i]=0;
}
这个程序如果在大尾端机器中则不会出现问题。
如果在小尾端机器中则会出现和上面的问题是一样的:死循环
另一个:
void foo()
{
int array[4];
int i;
for(i=0;i<=4;++i)
array[i]-=4;
}
假设array[i]的初始值都为0;
那就不会造成上面的情况,但是会造成这个函数foo会被执行n次,这是因为如果有一个函数failure调用了foo,那么failure的下一条指令的地址进入saved pc
然后就call <foo> 这样 因为每次执行array[4]-=4;使得saved pc中的值减去4,即又指向了call <foo>,又调用了foo函数,所以这个函数foo会一直执行下去。
感觉和上面一段代码差不多。。
其实这些错误的程序可以自己动手调试一下,打印出他们的信息,可以研究下,能学到好多的东西的。
如果有不正确的地方,欢迎提出来,这样也可以改正,谢谢。