2

我想知道当有更多的初始值设定项比数组大小时会发生什么,例如:初始值设定项大于数组大小时的行为是什么?

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

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

+0

什么是你的编译器btw? – Kos

+0

这是什么编译器?它在VS2010上出错。 – Mysticial

+0

甚至不应该编译:http://ideone.com/gWs4i – Nawaz

回答

7

该代码在C和C++中都不合格。

C++ 11第8.5.1节[dcl.init.aggr]/6的状态:

一种初始化列表是非法的构造如果初始化子句数超过要初始化的成员或元素的数量。

C11§6.7.9/ 2的状态:

没有初始化应尝试以提供不包含内的实体所初始化的对象的值。

0

那它取决于你的compiller。有的甚至不会让你建立与,视觉Express提供:

error C2078: too many initializers 

凡为海湾合作委员会允许它飞行,但警告你有太多的元素...... 我不认为这是一个预期由于它未定义而给出这种情况下的行为,但它无法正常工作。

例:

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 

我没去成disasembly,但我敢肯定它只是运行到末其他数据。

+0

考虑到我[4]甚至没有在初始化程序中定义,我并不完全感到惊讶?它打印出我[3]的事实本身是惊人的,但不应该被期望,因为它是未定义的。 – ardent

+0

是的,我认为这是一个幸运的运行。 – Mike

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生成。

+0

为了让编译器分配三个元素,但是存储四个元素不仅仅是“不安全”的,这将是不正当的,为了惩罚程序员提供太多的初始化器而走出困境。 –

相关问题