数组越界之后

今天复习数据结构的时候在网上看到一道关于数组地址越界的题目,觉得很有意思就照着试了一下。
  int   i;  
  int   num[10];  
   
  for(i=1;i<=10;i++)  
        num[i] = 0;  
  printf("loop   end.");

问能否显示出"loop end."

答案应该是和编译器有关,要么死循环,要么数组地址越界读写错误。

数组越界这个很容易理解,而关于死循环出现的原因是,当 i=10 的时候 i 的地址和 num[i] 是一样的,也就是说这个时候 num[i]=10 相当于是对 i 进行了 i=0 的操作,于是死循环出现了。这应该是和编译器有关的,能不能出现死循环现象要看编译器是不是这样分配内存了。

为什么会出现地址重叠呢,我改了一下上面的代码,查看一下 i 和 num 的地址:

然后发现 i 的地址是 0x0012ff3c ,而 num[] 的地址是 0x0012ff14,中间正好差 40 个字节,也就是 10 个 int 的长度。也就是说 int(*(num+10)) 其实就是指向的 i 的值。

然后看到有人说C++的规范说数组的下标变量是放在数组的最后的,对于这个规范我没有去查,不过对于上面这个问题好像也没什么联系。

也就是说如果在 int i 和 int num[10] 中间定义一些其他的变量的话,num[10] 肯定就是写到别的变量地址上去了,对于循环本身也就没影响了。当然是在那个地址可以写的情况下,否则自然是挂掉没商量。

还有一点就是 i 和 num[] 的类型都是一样的,所以才会造成这样的重叠问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值