【搬运】C++下标越界后

【搬运】因为原来的博客要关,所以从原来的博客搬运过来。

最近遇到一个很奇怪的问题,在arm-linux下发现一个bug,用windows版验证也有这个问题,后来查到原因是下标错了,多加了1,后来修复了这个bug。可是测试人员在验证新版本时告诉我,原版本没有这个问题。后来了解到,该测试人员测试的额x86-linux版本。确实没有出现这个bug。这就奇怪了,肯定是用错了,肯定是下标加了个1。怎么会没问题呢。
遇到的bug抽象出来的示例代码如下:
#include <stdio.h>
bool aa[5]={false,false,true,false,true};
bool bb[5]={true,true,true,true,true};
int main()
{
    if(aa[5])
        printf("true\n");
    else
        printf("false\n");
    getchar();
    return 0;
}
这段代码运行后结果是什么呢?
这里的错误在于aa变量下标越界了,运行后的结果却有点出人意料。
在windows下编译后运行,结果为false
在arm-linux下编译运行,结果为false  
这两个就是我的程序出现bug的现象,本来想用aa[4],结果用成了aa[5],所以结果不是true。
但是,在x86-linux下编译运行,结果是true。这也就是测试人员为什么告诉我原版本没有问题的原因。结果是true啊。
冷静下来分析了一下。用了下面的测试代码运行后就一目了然了。
#include <stdio.h>
bool aa[5]={false,false,true,false,true};
bool bb[5]={true,true,true,true,true};
int main()
{
    for(int i=0;i<20;i++)
        printf("aa[%d]=%d\n",i,aa[i]);
    getchar();
    return 0;
}
下面是windows下和arm-linux下运行的结果
aa[0]=0
aa[1]=0
aa[2]=1
aa[3]=0
aa[4]=1
aa[5]=0
aa[6]=0
aa[7]=0
aa[8]=1
aa[9]=1
aa[10]=1
aa[11]=1
aa[12]=1
aa[13]=0
aa[14]=0
aa[15]=0
aa[16]=0
aa[17]=0
aa[18]=0
aa[19]=0
而在x86-linux下的运行结果如下:
aa[0]=0
aa[1]=0
aa[2]=1
aa[3]=0
aa[4]=1
aa[5]=1
aa[6]=1
aa[7]=1
aa[8]=1
aa[9]=1
aa[10]=0
aa[11]=0
aa[12]=0
aa[13]=0
aa[14]=0
aa[15]=0
aa[16]=0
aa[17]=0
aa[18]=0
aa[19]=0
不同的编译器对于全局变量的存储方式是不同的,windows各个数组是字节对齐的,而x86-linux却是紧密排列的,所以第一个数组越界的指针指向了第二个数组。
ps,各个平台下编译器版本:
windows下vs2010
编译arm-linux的编译器版本arm-linux-gnueabi-g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
编译x86-linux的编译器版本g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-17)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值