爲什麼這兩個數組初始化之間存在差異?C:兩個數組初始化之間的區別
char *message = "HELLO";
if(message[0] == 'H'){
// true
}
好的,這個工程。但是,這並不是:
char message[6] = "HELLO";
if(message[0] == 'H'){
// false
}
它們不是表達同一件事嗎?
爲什麼這兩個數組初始化之間存在差異?C:兩個數組初始化之間的區別
char *message = "HELLO";
if(message[0] == 'H'){
// true
}
好的,這個工程。但是,這並不是:
char message[6] = "HELLO";
if(message[0] == 'H'){
// false
}
它們不是表達同一件事嗎?
在第一代碼段,message
是一個指向字符的只讀陣列。您可以修改指針(例如++message
沒問題),但不能修改它指向的內容(message[0] = 'X'
會調用未定義的行爲)。
在第二個代碼片段中,message
是一個帶有初始值設定項的字符數組。您無法修改該變量(++message
無效),但可以修改該數組的內容(message[0] = 'X'
很好)。
另外sizeof(message)
可能會有所不同。
它們的行爲類似,只需訪問message[0]
;也就是說,要麼你錯誤地聲稱你的行爲,要麼你的編譯器有一個非常令人驚訝的錯誤。
但他們是不同的事情,並在幾個方面表現不同,其中一些我剛剛列舉。
"HELLO"
的類型爲const char *
。但由於歷史原因,這可以視爲char *。
char messagd[6]
是堆棧上的字符數組。一個不同的野獸。
您需要使用strcpy
來填充該陣列
他們是。我用gcc 4.8.2獲得了預期的行爲。 –
這兩個都是我的 –
看來,也許你給了一個不正確的例子。這兩者應該並且確實評估爲真(以及「if(」HELLO「[0] =='H')')。 –