当初始化程序多于数组大小时,行为是什么?

时间:2012-08-29 16:51:10

标签: c arrays initialization object-initializers aggregate-initialization

我想知道当初始化程序多于数组大小时会发生什么,例如: :

int t[3] = { 1, 2, 3, 4 };

当然,我的编译器警告它。我期待未定义的行为,但我没有在C11标准中找到任何关于它的条款。那么,我错过了什么吗?

3 个答案:

答案 0 :(得分:7)

代码在C和C ++中都是错误的。

C ++11§8.5.1[dcl.init.aggr] / 6陈述:

  

如果 initializer-clauses 的数量超过要初始化的成员或元素的数量,初始化列表格式不正确。

C11§6.7.9/ 2规定:

  

初始化程序不应尝试为未初始化的实体中包含的对象提供值。

答案 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,但我很确定它最终会遇到其他数据。