数组越界
- C/C++ code
#include<stdio.h>void main(){ int a[5],i,j,t,*p=a; printf("Input 5 numbers:"); for(i=0;i<5;i++) scanf("%d",(p+i)); for(i=0;i<5;i++) { for(j=4;j>=i;j--) if(a[j+1]<a[j]) { t=a[j+1]; a[j+1]=a[j]; a[j]=t; } } for(i=0;i<5;i++) printf("%5d",*(p+i)); printf("\n");}程序中的a[j+1]明显是越界了,为什么编译能通过?
就算是数组越界VC不一定报错且能够通过编译,
那又为什么输入五个数运行之后能够正常排序输出?
[解决办法]
因为C语言信奉:程序员自己知道自己在做什么。
而显然,你不知道你在做什么。
当然,你现在人品足够好,所以,一切“正常”
但是,出来混,人品不可能一直好。
[解决办法]
通过编译,只说明语法正确
不代表逻辑正确
我调试一下,是通过编译,但是运行会出错
你能排序正确,是因为,正好碰到a[5]这个未知区域中装了一个比输入的5个数中最大数还更大的数
所以,这时候不影响你的排序
但,这是运气
[解决办法]
若是如下的代码:
则可看出
- C/C++ code
#include <stdio.h>
void main()
{
int a[5],i,j,t,*p=a;
printf("Input 5 numbers:");
for(i=0;i <5;i++)
scanf("%d",(p+i));
for(i=0;i <5;i++)
{
for(j=4;j>=i;j--)
if(a[j+1] <a[j])
{
t=a[j+1];
a[j+1]=a[j];
a[j]=t;
}
}
for(i=0;i[color=#FF00FF] <=[/color]5;i++)
printf("%5d",*(p+i));
printf("\n");
}
输入:1 3 5 7 9 11后,
输出的结果为:1 3 5 7 91245120
注意最后一个数是1245120
这个数组虽然越界了,但取到的后面一个数a[5],
不是一个不可取的数,即此数不在危险区内,所以编译器不报错
另个像大家所知,C/C++为了保证其高效性,是不检查数组越界的
由此可知,在取到非危险区的数是不报错的