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
相关产品推荐
相关产品推荐

