数组越界之后
2007-11-27 12:37
113 查看
今天复习数据结构的时候在网上看到一道关于数组地址越界的题目,觉得很有意思就照着试了一下。
问能否显示出"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[] 的类型都是一样的,所以才会造成这样的重叠问题。
int i; int num[10]; for(i=1;i<=10;i++) num[i] = 0; printf("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[] 的类型都是一样的,所以才会造成这样的重叠问题。
相关文章推荐
- iOS中防止数组越界之后发生崩溃
- 关于一个数组越界之后的死循环
- XCode6报数组越界错误的问题
- 分析数组越界时:' 烫'的由来
- iOS 关于数组越界的解决方法
- C++中将数组作为形参时防止访问越界的几种方法
- 数组越界也可以这么巧~~~
- 一个很经典的、很难看出来的数组越界错误
- 数组越界写入破坏程序堆栈导致的crash
- 墨菲定律与 IndexOutOfBoundsException(数组越界异常)
- jxl Workbook.getWorkbook(is)数组越界的问题解决
- searchDisplayController 引起的数组越界处理办法
- Thinking in java 多线程导致数组越界崩溃的BUG
- Numberpicker 数组角标越界问题
- Objc中处理数组越界的一种办法
- 11.3---旋转有序数组之后查找元素(CC150)
- C++字符数组越界问题的一个案例分析
- 数组越界为什么没有出错?
- [Android异常]listview(含上拉加载,上拉加载)下拉刷新报数组越界异常
- 谨防动态数组越界造成的内存泄露