今天复习数据结构的时候在网上看到一道关于数组地址越界的题目,觉得很有意思就照着试了一下。
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[] 的类型都是一样的,所以才会造成这样的重叠问题。