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

C++程序数组越界后输出值的来源咨询

数组越界后输出值的来源解释

你编写的C++代码如下:

#include <iostream>

using namespace std;

int main() {
    int a[] {0,2,4,6,8};
    int *b = a;
    for (int i=0;i<25;i++) {
        cout << *b << endl;
        *b++;
    }
    return 0;
}

执行时前5行输出数组a的元素0、2、4、6、8,之后出现了一系列随机整数(比如0、-858993460等),这些后续值的来源可以这样解释:

你的代码核心问题是数组越界访问:数组a仅包含5个int元素,但循环执行了25次。指针b遍历完数组所有元素后,继续向后移动并解引用,这属于C++标准定义的未定义行为——不过实际运行中读取到的后续值,来自内存中数组a之后的栈区域数据。

具体来说,局部数组a是在函数main的栈帧上分配的内存,栈内存的布局由编译器和操作系统决定,后续读取到的内容通常来自这些地方:

  • 栈上的其他局部变量:比如循环变量i、指针b本身的存储位置(不同编译器可能把它们放在数组的前面或后面)
  • 栈帧的元数据:比如函数调用的返回地址、栈基指针(RBP/EBP寄存器)的值
  • 之前函数调用残留的栈数据:比如程序启动时初始化栈留下的垃圾值

这些内存区域并不属于数组a的合法范围,所以读取到的都是“随机”的残留值——不同编译器、不同运行环境甚至每次运行,输出的结果都可能不一样。

需要强调的是,这种越界访问是严格禁止的,未定义行为可能导致程序崩溃、数据损坏甚至执行恶意操作,绝对不能依赖这种行为的输出结果。

内容的提问来源于stack exchange,提问作者Morko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:05:13