数组越界的陷阱

  以前在项目中,发现了一个由于数组越界访问的BUG。数组越界访问的结果是未定义的,在大多数情况下,会出现空指针异常。

    但是如果在结构体中,两个数组的内存分配是连续的。为了示例方便,我将代码做了简化,例如如下面的test结果体中,数组a和数组b的内存是连续的,也就是说a[9]后面跟的就是b[0].

    因此在访问a的时候,如果数组越界,就会访问到数组b中,例如a[29]=b[19]; 因此如果不对a的数组访问进行下标校验,将会从b中取得数据,如果在对a赋值时越界,将会对b中的数据进行修改,这将会带来调试的巨大麻烦,表现形式是b数据在某个地方被修改了。

 1struct test
 2{
 3    int a[10];
 4    int b[20];
 5}
;
 6int main()
 7{
 8    struct test t;
 9    int result;
10    for(int i=0;i<20;i++)
11    {
12        t.b[i]=i+1;
13    }

14    result=*(t.a+29);
15    printf("the result is %d",result);
16    return 0;
17}
因此,切记在访问或者操作数组时,一定要对数组下标进行校验,例如上面的例子可以修改为:
1if(index<10&&index>=0
2{   
3    result=a[index]); 
4}

5

posted on 2010-07-18 01:31 role0523 阅读(746) 评论(2)  编辑 收藏 引用

评论

# re: 数组越界的陷阱 2010-07-18 15:27 陈梓瀚(vczh)

不如用vector代替你的if  回复  更多评论   

# re: 数组越界的陷阱 2010-07-18 17:03 role0523

@陈梓瀚(vczh)
嵌入式项目中 vector还是比较慎用的  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

统计

常用链接

留言簿

随笔档案

搜索

最新评论

  • 1. re: i++与++i
  • @role0523
    基本上是没有去区别的,有时候++i能被优化掉,但很多时候编译器能发现他们是一样的,所以没有区别。
  • --chaogu
  • 2. re: i++与++i
  • @chaogu
    忘记在谁的blog上看到在比较i++和++i哪个操作更高效,于是就看看他们汇编指令的条数。其实大多数时候都是一样的。
  • --role0523
  • 3. re: 数组越界的陷阱
  • @陈梓瀚(vczh)
    嵌入式项目中 vector还是比较慎用的
  • --role0523
  • 4. re: 数组越界的陷阱
  • 不如用vector代替你的if
  • --陈梓瀚(vczh)
  • 5. re: i++与++i
  • 用汇编表达了一个很早就被默认了的定理,好还是不好呢?
  • --chaogu

阅读排行榜

评论排行榜