字串文字
字串文字表示 char
的以 null 結尾的靜態持續時間陣列。因為它們具有靜態儲存持續時間,所以可以安全地以指向自動陣列的指標的多種方式使用字串文字或指向相同底層陣列的指標。例如,從函式返回字串文字具有明確定義的行為:
const char *get_hello() {
return "Hello, World!"; /* safe */
}
由於歷史原因,對應於字串文字的陣列元素不是正式的 const
。然而,任何修改它們的嘗試都有不確定的行為 。通常,嘗試修改與字串文字對應的陣列的程式將崩潰或以其他方式發生故障。
char *foo = "hello";
foo[0] = 'y'; /* Undefined behavior - BAD! */
如果一個指標指向一個字串文字 - 或者它有時可能會這樣做 - 建議指出該指標的指示符,以避免意外地處理這種未定義的行為。
const char *foo = "hello";
/* GOOD: can't modify the string pointed to by foo */
另一方面,指向或進入字串文字的底層陣列的指標本身並不特殊; 它的值可以自由修改以指向其他內容:
char *foo = "hello";
foo = "World!"; /* OK - we're just changing what foo points to */
此外,雖然 char
陣列的初始化程式可以與字串文字具有相同的形式,但使用這樣的初始化程式並不會賦予初始化陣列上字串文字的特徵。初始化程式只是指定陣列的長度和初始內容。特別是,如果沒有明確宣告 const
,元素是可修改的:
char foo[] = "hello";
foo[0] = 'y'; /* OK! */