我想知道当有更多的初始值设定项比数组大小时会发生什么,例如:初始值设定项大于数组大小时的行为是什么?
int t[3] = { 1, 2, 3, 4 };
当然,我的编译器会警告它。我期望未定义的行为,但我在C11标准中没有找到任何关于它的条款。那么,我错过了什么?
我想知道当有更多的初始值设定项比数组大小时会发生什么,例如:初始值设定项大于数组大小时的行为是什么?
int t[3] = { 1, 2, 3, 4 };
当然,我的编译器会警告它。我期望未定义的行为,但我在C11标准中没有找到任何关于它的条款。那么,我错过了什么?
该代码在C和C++中都不合格。
C++ 11第8.5.1节[dcl.init.aggr]/6的状态:
一种初始化列表是非法的构造如果初始化子句数超过要初始化的成员或元素的数量。
C11§6.7.9/ 2的状态:
没有初始化应尝试以提供不包含内的实体所初始化的对象的值。
那它取决于你的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,但我敢肯定它只是运行到末其他数据。
我看了一下为您的示例生成的汇编程序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生成。
为了让编译器分配三个元素,但是存储四个元素不仅仅是“不安全”的,这将是不正当的,为了惩罚程序员提供太多的初始化器而走出困境。 –
什么是你的编译器btw? – Kos
这是什么编译器?它在VS2010上出错。 – Mysticial
甚至不应该编译:http://ideone.com/gWs4i – Nawaz