为什么在C语言中可以初始化超出数组大小的元素?
关于C语言数组越界与初始化的问题解答
一、初始化时提供多值的情况
你写的int array[1] = {12,2,12,12,12,31};属于违反C语言标准的写法:当用初始化列表初始化数组时,初始值的数量不能超过数组声明的大小。
合规的编译器至少会给出警告(严格编译模式下会直接报错)。即便某些编译器允许编译通过,数组也只会将第一个初始值12赋值给array[0],剩下的初始值会被直接忽略,不会对数组产生任何影响。
二、数组越界读写仍能运行的原因
你后续执行的array[1] = 1;、array[8] = 3;以及对应的打印操作,都属于数组越界访问/修改,这是C语言中明确的未定义行为。
未定义行为的核心是:C语言标准不规定这种操作的结果,程序可能出现任何情况——正常运行、崩溃、篡改其他变量数据、输出奇怪结果等等。你的程序能正常运行只是巧合:越界访问的内存区域暂时没有被系统的内存保护机制拦截,也没有覆盖程序运行必需的关键数据。但这种写法绝对不安全,换个环境、编译器或者程序逻辑稍有变化,就可能直接崩溃或者产生错误结果。
内容的提问来源于stack exchange,提问作者Jorge
相关产品推荐
相关产品推荐

