函数返回数组时的输出行为解析:越界值为何非零?
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
相关产品推荐
相关产品推荐

