C语言两种数组初始化方式下未显式赋值元素的取值差异问题
C语言数组下标4取值差异原因
核心规则依据
C语言标准对数组初始化有明确规定:
- 数组定义时提供的初始化列表长度小于数组总长度时,所有未被显式赋值的剩余元素会被自动初始化为对应类型的零值(int类型对应值为0)。
- 数组定义时未提供任何初始化列表时,所有元素默认处于未初始化状态,存储的是对应内存地址上遗留的随机垃圾值,访问这类值属于未定义行为。
对应代码场景分析
- 针对
arr3[5] = {1,2,3,4}:
初始化列表只有4个初始值,数量少于数组的5个元素长度,因此下标为4的第5个元素会被编译器自动填充为0,打印结果固定为0。 - 针对
arr2[5]:
定义时没有配置任何初始化列表,仅后续手动给下标0到3的元素赋值,下标为4的元素从未被赋值,保留了栈内存的原有垃圾值。你看到的-858993460是Windows平台下VS/VC编译器调试模式给未初始化栈空间统一填充的0xCCCCCCCC标记对应的int十进制值,不同编译环境、运行场景下这个值会随机变化。
注意
访问未初始化的变量属于C标准定义的未定义行为,实际开发中建议所有数组定义时完成初始化,或者显式给所有需要访问的元素赋值,避免出现不可预期的运行结果。
内容的提问来源于stack exchange,提问作者Eladtopaz
相关产品推荐
相关产品推荐

