读书人

数组越界解决思路

发布时间: 2012-04-13 13:50:24 作者: rapoo

数组越界

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++为了保证其高效性,是不检查数组越界的
由此可知,在取到非危险区的数是不报错的

读书人网 >C语言

热点推荐