C语言中未初始化数组元素为何不总是为0?
C语言局部未初始化数组元素为何不是0?
核心原因
你代码里的array_unsorted是函数内的局部数组,它存储在程序的栈内存区域。栈内存会复用之前程序运行留下的残留数据,所以未初始化的局部变量/数组元素的值是未定义的——既不会固定为0,也没有确定值,完全取决于当前栈空间里的残留内容。
教材里提到的“自动初始化为0”,针对的是全局变量或静态变量:这类变量存储在全局/静态存储区,C标准明确要求它们会被自动置0,但局部变量不在这个规则范围内。
你的代码具体问题
- 输入的4566371是7位数,循环只给
array_unsorted[0]到array_unsorted[6]赋了值(对应数字1、7、3、6、6、5、4)。 - 你的打印循环从
j=MAX(也就是10)开始,而数组大小是MAX=10,合法索引范围是0到9,这里j=10属于数组越界访问,这也是未定义行为,会读取到栈里更随机的内容(比如输出里的第一个77)。 array_unsorted[7]到array_unsorted[9]没被赋值,保留了栈里的残留数据,所以出现0、8、32765这类随机数。
实现期望输出的方法
如果想让未使用的数组元素为0,有两种简单方式:
- 显式初始化数组:
int array_unsorted[MAX] = {0};——C语言中,数组初始化时若只给第一个元素设为0,其余元素会自动被初始化为0。 - 把数组声明为静态变量:
static int array_unsorted[MAX];——静态局部变量存储在全局存储区,会被自动置0。
另外要修正越界问题:打印循环应该从MAX-1(也就是9)开始,避免访问数组范围外的内存,修改后的循环代码:
for (j = MAX - 1; j >= 0; j--) { printf("%d ", array_unsorted[j]); }
内容的提问来源于stack exchange,提问作者Ibtida Bin Ahmed
相关产品推荐
相关产品推荐

