今天写了个冒泡算法从小到大排序的小程序。编译之后DOS界面出现了,但是会发生如下错误:
原部分代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
int main(void)
{
sport a[12]={{"001",13.6},{"002",14.8},{"010",12.0},
{"011",12.7},{"023",15.6},{"025",13.4},
{"031",14.9},{"036",12.6},{"037",13.4},
{"102",12.5},{"325",15.3,{"438",12.7}};
sport temp;
int i,j;
int row=12;
/*冒泡排序算法*/
for(i=0; i<=row-1; i++)
for(j=0; j<row-i; j++)
{
if(a[j].grade > a[j+1].grade)
{
temp = a[j];
a[j]= a[j+1];
a[j+1] = temp;
}
}
相信一些大牛看到代码就会明白错在哪里了。原本啊a[0]位置出现不明字符,从而导致最高位被挤出数组范围。
就这样慢慢看,最后找打原因所在---数组范围溢出。当i=0,j=11,会出现if(a[11].grade > a[12].grade)
很明显a[12]是不存在的,从而访问溢出,用其他值给代替了。找到问题,修改就简单了:
for(i=0; i<=row-1; i++)
for(j=0; j<row-i-1; j++)
{
if(a[j].grade > a[j+1].grade)
{
temp = a[j];
a[j]= a[j+1];
a[j+1] = temp;
}
}
结果如下:
结果正确。
数组溢出是个常见的问题,没想到还是栽了,真要好好反省,也希望诸读者不要犯同样的错误!