为什么C语言数组越界访问时末尾元素会输出数组大小8?
问题原因分析
你遇到的现象是数组越界访问触发的未定义行为,具体原因如下:
- 你定义的
int position[8]是长度为8的整型数组,C语言规定数组下标从0开始,合法访问范围仅为position[0]~position[7],position[8]不属于数组的合法内存空间,访问该地址属于越界操作。 - 你在两次循环中都写了
for(loopNumber = 0;loopNumber <= 8; loopNumber++)、for(loopNumber2 = 0;loopNumber2 <= 8; loopNumber2++),循环执行了9次,每次都访问到了越界的position[8]。 - 栈上的局部变量是连续排布的,
position数组之后紧邻的内存空间恰好是循环变量loopNumber2的存储地址:- 第一次循环执行到
loopNumber=8时,你给越界地址position[8]赋值为-1,相当于把loopNumber2的初始值改成了-1,所以第一次打印的最后一位是-1。 - 第二次循环执行到
loopNumber2=8时,你读取越界地址position[8]的值,实际上读的就是loopNumber2自身的当前值8,所以第二次打印的最后一位是8。
- 第一次循环执行到
注意:数组越界属于C语言标准明确规定的未定义行为,当前输出只是你当前编译环境、编译参数下的偶然表现,换环境可能出现乱码、程序崩溃等完全不同的结果。
修复方案
把两次循环的终止条件从<=8改成<8即可,修改后循环只会访问position[0]~position[7]的合法地址:
// 第一次循环修改为 for(loopNumber = 0;loopNumber < 8; loopNumber++) // 第二次循环修改为 for(loopNumber2 = 0;loopNumber2 < 8; loopNumber2++)
内容的提问来源于stack exchange,提问作者Slayan
相关产品推荐
相关产品推荐

