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

函数返回数组时的输出行为解析:越界值为何非零?

C++数组越界访问问题解析

测试代码

#include<iostream> 
using namespace std; 
int * arrayReturn(); 

int main(){ 
    for(int i=0; i<10; i++){ 
        cout<<"Value at "<<i<<": "<<arrayReturn()[i]<<endl; 
    } 
    return 0; 
} 

int * arrayReturn(){ 
    static int arr[] = {10,20,30,40}; 
    return arr; 
}

问题

请解析上述代码的输出结果,为何索引4的位置值为4659536,索引8、9的位置值为-1而非0?(注:仅需解释原因,无需给出代码修正建议)

原因说明

咱们先抓核心:这段代码触发了数组越界访问的未定义行为,具体原因拆解如下:

  • 首先看arrayReturn()里的静态数组arr,它只初始化了4个元素,对应的有效索引范围是0~3。当main函数循环到i>=4时,你其实在访问数组内存范围之外的区域,这完全不符合C++的规范要求。
  • C++标准明确规定,数组越界访问属于未定义行为——也就是说,语言本身不保证这种操作的结果,读取到的值完全取决于程序当前的内存布局:可能是之前程序运行留下的内存残留值,也可能是其他变量的内存内容,甚至可能直接导致程序崩溃。
  • 至于为什么是4659536、-1而不是0?因为C++不会自动为数组之外的内存区域做初始化(哪怕是静态存储区),这些位置的内存没有被显式赋值过,所以读取到的就是该内存地址上的“垃圾值”。换个编译器、换个运行环境,你得到的数值大概率会不一样,这正是未定义行为的典型表现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 00:22:39