2012-01-05 47 views

回答

3

char word1[] = "shoe";創建一個由5個字符組成的數組,並將字符串文字「shoe」複製到其中(可以修改)。

char *word2 = "shoe";創建一個指向字符串文字「shoe」(無法修改)的指針。

5

區別在於第一個是有效的代碼,而第二個的行爲是未定義的(因爲您不允許修改字符串文字)。請參閱FAQ

+2

如果每次有人問及修改'const char *'的時候我有一美元...... – 2012-01-05 23:15:41

+0

@EdS .:但它*不是* const char *'。 C中的字符串文字不是'const';試圖修改它們只是未定義的行爲。 (在C++中它們是'const')。 – 2012-01-05 23:26:14

+0

對,這是一個糟糕的設計決定。他們*應該*爲const,但我承認我錯過了C標籤並假定C++。 – 2012-01-05 23:39:58

1

的問題是你char *word2 = "shoe";被存儲在.rodatadata section

$ readelf -p .rodata adum 

String dump of section '.rodata': 
    [  4] shoe 
    [  9] %s 

(這會更容易看到,如果你存儲shoe在其他變量的一個變量,foot

允許編譯器將字符串常量存儲在只讀存儲器中,因爲標準不允許修改字符串文字。

你的第一種情況是一個明確初始化的字符數組;標準確實允許修改這些,所以它們不存儲在只讀部分。