2011-09-14 34 views
4

可能重複:
What is the difference between char s[] and char *s in C?由數組和指針創建的字符串之間的區別?

是什麼這之間的區別:

char arr[] = "Hello, world!"; 

這:

char *arr = "Hello, world!"; 

兩個字符串的內存在哪裏分配?爲什麼我無法更改後一個字符串的內容?

+3

嚴格地說,後者應該閱讀'const char * arr =「hello world!」;' – Nemo

+1

@Nemo:它*應該*,但嚴格來說C不需要它。 C字符串文字不是'const',但試圖修改其中一個是未定義的行爲 –

+1

@teacher:這個問題在SO上已經被問過很多次了。快速搜索給出了這些鏈接。 (一)http://stackoverflow.com/questions/1704407/what-is-the-difference-between-char-s-and-char-s-in-c (二)http://stackoverflow.com/questions/1880573/c-difference-between-char-var-and-char-var – Bhaskar

回答

5

第一個是專門爲arr分配的可寫內存,這是一個char s的數組。您可以修改它,而不會調用未定義的行爲。這是完全合法的:

char arr[] = "Hello, world!"; 
arr[1] = 'i'; 

第二個是指向只讀字符串的指針。因此,這是未定義的行爲

char *parr = "Hello, world!"; 
parr[1] = 'i'; // Cannot write to read-only memory! 

一些編譯器實現:

char *a = "Hello, world!"; 
char *b = "Hello, world!"; 

a[1] = 'i'; 
// b[1] == 'i'; 

這並不能保證 - 我只包括它給你一個'直覺'的感覺,爲什麼它是undefined行爲。

+0

都是在堆棧上創建的字符串? – teacher

+0

不,只讀字符串存儲在您正在處理的內存的只讀部分。 – Simon

+0

@teacher:取決於你聲明它的地方,而在第二個例子中,實際的字符串是在只讀內存中。 –

相關問題