可能重複:
What is the difference between char s[] and char *s in C?由數組和指針創建的字符串之間的區別?
是什麼這之間的區別:
char arr[] = "Hello, world!";
這:
char *arr = "Hello, world!";
兩個字符串的內存在哪裏分配?爲什麼我無法更改後一個字符串的內容?
可能重複:
What is the difference between char s[] and char *s in C?由數組和指針創建的字符串之間的區別?
是什麼這之間的區別:
char arr[] = "Hello, world!";
這:
char *arr = "Hello, world!";
兩個字符串的內存在哪裏分配?爲什麼我無法更改後一個字符串的內容?
第一個是專門爲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行爲。
嚴格地說,後者應該閱讀'const char * arr =「hello world!」;' – Nemo
@Nemo:它*應該*,但嚴格來說C不需要它。 C字符串文字不是'const',但試圖修改其中一個是未定義的行爲 –
@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