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

爲了讓編譯器分配三個元素,但是存儲四個元素不僅僅是「不安全」的,這將是不正當的,爲了懲罰程序員提供太多的初始化器而走出困境。 –

相關問題