2.13 以下的初始化有什麼區別?char a[] = "string literal"; char *p = "string literal"; 當我向 p[i] 賦值的時候, 我的 程序崩潰了。

字符串常量有兩種稍有區別的用法。用作數組初始值 (如同在 char a[]  的聲明中), 它指明該數組中字符的初始值。其它情況下, 它會轉化為一個 無名的靜態字符數組, 可能會存儲在只讀內存中, 這就是造成它不一定能被修改。 在表達式環境中, 數組通常被立即轉化為一個指針  (參見第 6 章), 因此第二個聲明把 p 初始化成 指向無名數組的第一個元素。

為了編譯舊代碼, 有的編譯器有一個控制字符串是否可寫的開關。

參見問題 1.11、 6.1、 6.2 和 6.6

參考資料: [K&R2, Sec. 5.5 p. 104]; [ISO, Sec. 6.1.4, Sec. 6.5.7]; [Rationale, Sec. 3.1.4]; [H&S, Sec. 2.7.4 pp. 31-2]。

翻譯朱群英、孫雲, LaTeX2HTML 編譯 朱群英 (2005-06-23)