2012-04-25 240 views
7

我想知道是否有之間的差異:{0}和「」之間有什麼區別?

char s[32] = ""; 

和:

char s[32] = {0}; 

感謝。

+0

答案已經給出。但是,如果你現在應該考慮''{0}'和''''沒有什麼區別,可以用其他類型來嘗試,例如'int'數組而不是'char'數組。然後你會看到不同之處。 – 2012-04-25 13:31:27

回答

18

不存在雙方的聲明沒有區別:

char bla[32] = {0}; 

and 

char bla[32] = ""; 

見C標準(重點煤礦)的有關段落:

(C99,6.7.8p21)「如果有在大括號內的列表中的元素或成員的個數比元素或成員更少,在字符串文字中使用或更少的字符用於初始化比數組中的元素大小的已知大小的數組,集合的其餘部分應爲初始化s作爲具有靜態存儲時間的對象。「

+0

好的,非常感謝! – md5 2012-04-25 13:26:45

+1

也就是說,只要''\ 0'== 0'。 – Philip 2012-04-25 14:22:11

+2

@Philip我沒有標準的引用,但是這是K&R 2nd的說法*「字符常量'\ 0'表示字符的值爲零,空字符。'\ 0'通常被寫入而不是0 「* – ouah 2012-04-25 15:00:56

10

在這種情況下,沒有差別,這兩種初始化所述陣列的所有時隙爲0。在一般情況下,""僅對char陣列的工作原理(具有或不具有像constunsigned修改),但{0}作品所有數值的陣列類型。

在標準(n1570)第6.7.9,點21讀取

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

所以即使""初始化完整的數組。

+0

+1'{0}'適用於任何允許使用初始值設定項的數據類型。另一方面,它不適用於所有陣列,即不適用於VLA,因爲它們不能有初始化器。 – 2012-04-25 14:10:21

2

兩個表達式的結果是相同的:一個空字符串。但是,第一個更明確,因此更具可讀性。

2

沒有區別。你也可以親眼看到!這是你可以得到的最可靠的答案。只需使用調試器。執行兩行並比較結果。但是你應該重新命名數組。我使用gcc/gdb編譯以下代碼

int main(int argc, char* argv[]) 
{ 
    char s[5] = {0}; 
    char t[5] = ""; 
    return 0; 
} 

通過gcc -g test.c然後調用gdb a.out。在gdb我進入

break 5 
run 
print s 

的最後一條語句是通過GDB與下面的輸出回答:

$1 = "\000\000\000\000" 

我繼續,進入 「印花T」,並得到相應的

$2 = "\000\000\000\000" 

告訴我用我的編譯器選擇這兩個語句導致相同的結果。

+3

Matthias:這不是最可靠的方法,因爲任何未定義的行爲都可能因編譯器實現或由於未初始化的內存內容的不同而不同... ... – 2012-04-25 13:30:30

+0

@ tony-delroy我澄清並希望我讓我的觀點更清晰(我didn但是我真的不明白你的意思) – Matthias 2012-04-25 20:07:06

+1

我的觀點是,要知道你的程序在特定的運行中做了什麼並不能證明C++標準要求任何C++編譯器從該源代碼生成的任何可執行文件要做什麼。如果你想要可靠的代碼,你堅持標準保證的內容,因爲可觀察的程序行爲可能會有所不同。例如,如果您從未初始化的變量中讀取 - 'int x; std :: cout << x <<'\ n';' - 你可能偶然看到你期望的數字(特別是如果你期望0),但重新運行該程序或重新編譯它,以及你可能會得到不同的輸出.... – 2012-04-26 02:30:02

2

除了什麼已經說了:

char s[32] = ""; 

=

char s[32] = {'\0'}; 

=

char s[32] = {0}; 

=

char s[32] = {0, 0, 0, /* ...32 zeroes here*/ ,0 }; 

所有這些將導致正好是相同的機器碼:一個32字節的數組填充所有的零。

相關問題