我想知道當有更多的初始值設定項比數組大小時會發生什麼,例如:初始值設定項大於數組大小時的行爲是什麼?
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