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

C语言中数组初始化与未初始化的差异:为何两种方式均生效?

两种数组声明方式的差异

我编写了一段用于统计输入中各数字出现次数的代码(输入-1结束)。我分别尝试了int count[10];和int count[10]={0};两种声明方式,发现两种方式都能得到正确结果。想请教这两种方式之间的差异是什么?

#include <stdio.h>
int main(){
    
    int count[10];
    int i,num;

    while(1){
        scanf("%d", &num);
        
        if(num==-1){
            break;
        }

        if(num>=0 && num<=99){
            if (num<10){
                count[num]++;
            }
            else{
                count[num/10]++;
                count[num%10]++;
            }
        }
    }

    for(i=0; i<10; i++){
        printf("%d : %d\n", i,count[i]);
    }
    return 0;
}

这两种写法的核心差异在于数组元素的初始值是否确定:

1. int count[10];:未初始化的局部数组

  • 因为count是main函数内的局部变量(自动存储期),C标准规定这类未显式初始化的变量,其值是不确定的——数组元素会继承栈内存里原来的垃圾值,可能是0,也可能是随机整数。
  • 你这次得到正确结果是巧合:要么这块栈内存刚好被清0,要么你输入的数字覆盖了所有数组元素的初始垃圾值,最终输出看起来正常。但换个运行环境、或者程序执行顺序变化,大概率会出现错误统计(比如某个没出现过的数字计数不为0)。

2. int count[10]={0};:显式初始化全为0

  • 当你用={0}初始化数组时,C语言会将第一个元素设为0,并且自动把剩余所有元素也初始化为0,整个数组的初始状态是确定的全0。
  • 这才是统计次数场景的正确写法,能保证无论什么运行环境,计数都是从0开始累加,不会受垃圾值干扰。

额外说明:全局数组的例外

如果把count定义在main函数外面(全局变量),那不管写不写={0},C标准都会自动将所有元素初始化为0。但你的代码里是局部数组,必须显式初始化才能确保初始值正确。


内容的提问来源于stack exchange,提问作者Kim Do Kyeong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 18:42:29