2014-06-08 38 views
0

爲什麼這兩個數組初始化之間存在差異?C:兩個數組初始化之間的區別

char *message = "HELLO"; 

if(message[0] == 'H'){ 
    // true 
} 

好的,這個工程。但是,這並不是:

char message[6] = "HELLO"; 

if(message[0] == 'H'){ 
    // false 
} 

它們不是表達同一件事嗎?

+0

他們是。我用gcc 4.8.2獲得了預期的行爲。 –

+0

這兩個都是我的 –

+2

看來,也許你給了一個不正確的例子。這兩者應該並且確實評估爲真(以及「if(」HELLO「[0] =='H')')。 –

回答

0

在第一代碼段,message是一個指向字符的只讀陣列。您可以修改指針(例如++message沒問題),但不能修改它指向的內容(message[0] = 'X'會調用未定義的行爲)。

在第二個代碼片段中,message是一個帶有初始值設定項的字符數組。您無法修改該變量(++message無效),但可以修改該數組的內容(message[0] = 'X'很好)。

另外sizeof(message)可能會有所不同。

它們的行爲類似,只需訪問message[0];也就是說,要麼你錯誤地聲稱你的行爲,要麼你的編譯器有一個非常令人驚訝的錯誤。

但他們是不同的事情,並在幾個方面表現不同,其中一些我剛剛列舉。

0

"HELLO"的類型爲const char *。但由於歷史原因,這可以視爲char *。

char messagd[6]是堆棧上的字符數組。一個不同的野獸。

您需要使用strcpy來填充該陣列

相關問題