您的位置:首页 > 理论基础 > 数据结构算法

数组越界之后

2007-11-27 12:37 113 查看
今天复习数据结构的时候在网上看到一道关于数组地址越界的题目,觉得很有意思就照着试了一下。

  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[] 的类型都是一样的,所以才会造成这样的重叠问题。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编译器 数据结构 c++ c