char a[] = "Hello World!";
這種分配修改陣列只是大足以容納字符串字面量(包括終止NUL字符)。然後它用字符串文字的內容初始化數組。如果它是一個局部變量,那麼這意味着它在運行時會執行memcpy
,每次創建局部變量時都會如此。
當您需要修改字符串時使用此選項,但不需要將其設置得更大。
此外,如果您有char *ap = a;
,那麼當a
超出範圍時ap
將成爲懸掛指針。或者,同樣的事情,當a
對於那個函數是局部的時候,你不能做return a;
,因爲返回值將懸掛指針到現在被銷燬的那個函數的局部變量。
請注意,恰好使用這一點很少見。通常情況下,你不需要一個數組與字符串文字的內容。這是更爲常見的有類似:
char buf[100]; // contents are undefined
snprintf(buf, sizeof buf, "%s/%s.%d", pathString, nameString, counter);
char *p = "Hello World!";
這定義指針,並初始化它指向字符串文字。需要注意的是字符串字面量(正常)不可寫入的,所以你真的應該有這個:
const char *p = "Hello World!";
使用此當你需要指向不可修改的字符串。
與上面a
,如果你有const char *p2 = p;
或做return p;
,這些都很好,因爲指針指向字符串中程序的常量數據的文字,有效期爲程序的整個執行。
字符串文字本身的文字withing雙引號,構成該字符串的實際字節,在編譯時創建並通常被放置與該應用程序內的其他常量數據。然後在代碼中字符串文字具體指這個常量數據blob的地址。
首先,使編譯器警告 – 2014-10-09 13:33:45
使用無論你想...只是語法糖en.wikipedia.org/wiki/Syntactic_sugar – zambotn 2014-10-09 13:34:11
你錯過了最重要的一點是在內存釋放,多久你希望你的對象a住在你的節目中。 – Martin 2014-10-09 13:34:33