我想知道当初始化程序多于数组大小时会发生什么,例如: :
int t[3] = { 1, 2, 3, 4 };
当然,我的编译器警告它。我期待未定义的行为,但我没有在C11标准中找到任何关于它的条款。那么,我错过了什么吗?
答案 0 :(得分:7)
代码在C和C ++中都是错误的。
C ++11§8.5.1[dcl.init.aggr] / 6陈述:
C11§6.7.9/ 2规定:如果 initializer-clauses 的数量超过要初始化的成员或元素的数量,初始化列表格式不正确。
初始化程序不应尝试为未初始化的实体中包含的对象提供值。
答案 1 :(得分:1)
我看了一下为你的例子生成的汇编程序gcc,看起来它需要“安全”的路径;它只是不加载超过数组大小的值:
void main() {
int t[3] = { 1, 2, 3, 4 };
}
生成以下程序集:
main:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl $1, -12(%ebp)
movl $2, -8(%ebp)
movl $3, -4(%ebp)
leave
ret
这是使用gcc 4.4.3生成的。
答案 2 :(得分:0)
这取决于你的掌声。有些人甚至不会让你构建,Visual Express给出:
error C2078: too many initializers
gcc允许它飞行但警告你有太多元素...... 我不认为在这种情况下存在预期的行为,因为它未定义,但它无法确定。
例如:
int t[3] = { 1, 2, 3, 4 };
int i;
for(i = 0; i< 5; i++){
printf("val = %d\n", t[i]);}
val = 1
val = 2
val = 3
val = 4
val = 134513760
我没有进入disassembly,但我很确定它最终会遇到其他数据。