下面是一个同学错误的插入排序,可能很多人都犯过越界异常的错误。
有兴趣的可以运行一下下面的C++程序,惊奇的发现外部变量size被改变了。
#include<iostream>
using namespace std;void print(int a[],int length)
{
for(int i=0;i<length;i++)
{cout<<a[i]<<" ";
}
}
void insertSort(int a[],int size)
{
for(int i=1;i<size;i++)
{
int temp=a[i];
int j=i;
while(j>=0&&temp<a[j-1])
{
a[j]=a[j-1];
j--;
}a[j]=temp;
}
}
int main()
{
int a[]={2,3,5,4,6,7,1,8,9,10};
int size=10;
insertSort(a,size);
cout<<"size"<<size<<endl;
print(a,size);
}
运行结果是:size被改为1;打印输出10;
下面解释原因:
int a[]={2,3,5,4,6,7,1,8,9,10};
int size=10;
首先在栈中开辟一个数组,在申请size变量,栈中内容是按地址减小的方向存放的,也就是说
size变量在 a[0]之前;注意到
while(j>=0&&temp<a[j-1])
{
a[j]=a[j-1];
j--;
}
中j>=0发生越界,相当于把a[0]前的10也参与了排序;发生溢出,从而改变size的值
调用print()函数时,size=1,所以只打印出10;