You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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的存储地址:
    1. 第一次循环执行到loopNumber=8时,你给越界地址position[8]赋值为-1,相当于把loopNumber2的初始值改成了-1,所以第一次打印的最后一位是-1。
    2. 第二次循环执行到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 04:30:04