C语言中int arr[5]={1,2,3,4,5,6,7,8,9}数组声明为何不报错?
C语言数组越界初始化及访问问题解答
为什么初始化列表长度超过数组大小时没有触发编译错误
ISO C标准明确规定:显式指定数组长度时,初始化列表的元素数量不得超过数组声明长度,该行为属于语法约束违反,编译器必须输出诊断信息。但绝大多数C编译器(如GCC、Clang)默认配置下仅对该行为输出警告,不会直接终止编译;而多数在线C编译器默认关闭高警告等级、甚至隐藏警告提示,因此你看不到违规提示,误以为代码完全合法。
如果编译时添加-Wall -Wextra -Werror参数,编译器会将该类违规行为判定为错误,直接终止编译流程。
为什么访问arr[5]得到垃圾值
- 你声明的
int arr[5]仅会分配5个int类型长度的连续内存空间,合法可访问的下标范围为0~4。 - 初始化时编译器只会按顺序将前5个初始化值赋值给
arr[0]~arr[4],多余的初始化项会被直接丢弃,不会写入数组对应的内存空间。 - 访问
arr[5]属于数组越界访问,是C语言标准明确规定的未定义行为:arr[5]对应的内存空间不属于arr数组的分配范围,该区域可能存储其他变量的值、栈内存残留数据,读取结果完全不确定,也就是你看到的垃圾值。该行为的结果不可控,部分运行环境下甚至会直接触发程序崩溃。
内容的提问来源于stack exchange,提问作者Muskan Kalra
相关产品推荐
相关产品推荐

