2011-10-30 19 views
0

如果我這樣定義如下標準行爲

char buffer[20] = "foo"; 

然後

buffer[0] == 'f'; 
buffer[1] == 'o'; 
buffer[2] == 'o'; 
buffer[3] == 0; 

什麼標準char緩衝區談談緩衝區[4]緩衝區[19]。他們是否保證初始化爲零?

回答

8

保證所有剩餘的元素初始化爲零。

參考:
C++ 03標準6.7.8節段21:

如果在一個大括號內的列表更少初始化值多於一個集合體的元件或部件,或用於初始化已知大小的數組的字符串字符的字符數少於數組中的元素,聚合的其餘部分應爲 ,隱式地初始化爲與具有靜態存儲持續時間的對象相同。

1

大量的編譯器將初始化緩衝區的內容[20]爲0,如果你用{}

初始化,您可以檢查你的編譯器的行爲使用這樣的事情,尤其如此:

#include <stdio.h> 

int main() { 
     char buf1[20] = "foo"; 
     char buf2[20] = {}; 
     int i; 
     for(i = 0; i < 21; i++) { 
       printf("%02x ", buf1[i]); 
     } 
     printf("\n"); 
     for(i = 0; i < 21; i++) { 
       printf("%02x ", buf2[i]); 
     } 
     printf("\n"); 
} 

請注意,我把21條件而不是20條只是爲了推動輸出超出實際的緩衝區分配。之後應該轉儲一些垃圾字節。

+2

行爲是由C++標準定義的**(在接受的答案中引用)。它不作爲編譯器的實現細節遺漏。您可以確定您不需要檢查它的行爲。 –

+1

如果你讀到的數組超出了數組的末尾,那麼你就不能說出什麼「應該」發生 - 這給出了未定義的行爲。 –