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

C语言中未初始化数组的取值来源:是随机值还是内存遗留值?

C语言中未初始化数组的取值来源解析

咱们直接说核心结论:C语言里未初始化的数组元素,不是被系统随机赋值,而是读取了这块内存区域里的「遗留旧值」——也就是这块内存之前被其他程序、或者当前程序的其他代码段使用后留下的数据。

为什么会这样?其实是C语言为了极致性能做的设计:当你在函数里声明局部数组(比如示例里的int values[10];)时,系统只是在栈内存里给它划出一块对应大小的空间,但不会主动清空这块空间里的原有内容。这些残留的数据看起来像“随机数”,但本质是内存里的历史垃圾值,并不是真正的随机生成的。

拿你给出的示例代码来看:

#include <stdio.h>
int main (void) {
    int values[10];
    int index;
    values[0] = 197;
    values[2] = -100;
    values[5] = 350;
    values[3] = values[0] + values[5];
    values[9] = values[5] / 10;
    --values[2];
    for ( index = 0; index < 10; index++ )
        printf ("values[%i] = %i\n", index, values[index]);
    return 0;
}

这段代码里只给values[0]、values[2]、values[3]、values[5]、values[9]做了赋值操作,剩下的values[1]、values[4]、values[6]、values[7]、values[8]都是未初始化的。运行时这些位置输出的数值,就是栈内存里对应位置之前留下的旧数据——每次运行结果可能不一样,因为栈的状态会随着程序的运行、系统的其他操作而变化。

还要提醒一句:读取未初始化的局部变量属于未定义行为,C语言标准并没有规定这些值具体是什么,不同编译器、不同操作系统甚至不同的运行时机,都可能给出不同的结果。所以写代码时一定要记得初始化变量和数组,避免出现莫名其妙的bug。

内容的提问来源于stack exchange,提问作者el-aasi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:08:27