首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

数组越界解决思路

2012-04-13 
数组越界C/C++ code#includestdio.hvoid main(){int a[5],i,j,t,*paprintf(Input 5 numbers:)for(i

数组越界

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

热点排行