==> ykjiang.bbs@ptt.cc (Yukuan) 提到:
> char *str = "string";
> 就是
> const char str[] = "string";
> 的簡略寫法,這是 C++ 從 C 那沿襲來的陋習。已經是慣用法了。
> 如果你還不懂,建議先去搞清楚 stack, heap 及 literal pool 間的差別。
先不談 const 的作用, 我們應該先來看 char *str 與 char str[] 這兩個宣告的差異
char *str="string"; 中 str 本身即是一個 local variable (佔有stack中實體memory
的指標變數) 而 = 號的初始化動作, 只是將 heap 中的 "string" 的值 assign 給 str
這個變數罷了. 值得注意的是所謂 "string" 的值, 是指在 heap 中存放 "string"字串
的第一個字元's'的 memory 的 address. ex 0xabcdef. 簡單的說, 這時候的 str 跟
宣告一個 int i 的 i 一樣個是 local variable, 只是型態不同 (一個是 char*, 一個
是 int).
然而 char str[]="string"; 這個宣告中真正的 local variable 是 str[] 這個 array,
而不是 str 本身, 重點是 str 此時並不是變數, 而是一個 constant,這個 constant 的
值代表著指向此時 stack 中的某處位址. 聰明的 compiler 必然會提醒你, 別把這個值,
直接當 return 傳出去. 這也就是為何會有 warning 的根本原因.
回傳 char *str 宣告的 str, 不會有 warning 的原因是因為 compiler 在編譯期間,
無法得知 str 這個變數 (variable) 的內容會不會是 stack 的位址. 當然就無法聰明
地發出警告, 這個責任, 自然就落在 programmer 自己的身上囉.
以上應該已經足以解釋原 PO 所疑惑的兩者之間的差異了.
如果有人有興趣, 可以進一步的去探索 char a[2][3]; 與 char **a的差異.
OK, 我們再回過頭來看看 const 這個修飾字.
當 const 用在一個變數宣告時, 主要是告訴 compiler 這個佔用記憶體的 variable
千萬不要允許改變其記憶體內的數值. 以 const char str[] = "string"; 這個敘述來說
, 提醒 compiler 要幫助留意檢查programmer有沒有企圖對 str[] 這個 array 作寫入的
動作(ex: str[3] = 'a'; ). 值得注意的是, 此時 str 本身依舊是個 address value 的
constant. 這部分跟 const 修飾字其實不是很有關係的.
同樣的, 我們可以這樣用 const
const char *str; 或者 char * const str; (抱歉很久沒寫 C了, 萬一有錯還請指正)
一個是 pointer 指向的 memory 被標示成 const (該memory內容不可變),
一個是 pointer variable 本身是 const (該指標變數內容不可變, 但被指向的 memory
則不設限)
在 C 語言中, 還有一些東西是 constant... 比如一個 function 的 name.
希望以上對大家有幫助.
> ※ 引述《Aligu1009 (=.=)》之銘言:
> : 作者: Aligu1009 (=.=) 看板: C_and_CPP
> : 標題: [問題] 函數回傳char*的問題
> : 時間: Tue Oct 17 19:56:22 2006
> : 在下面的程式片段中
> : char* getStr() {
> : // char str[] = "string"; // (1)
> : char* str = "string"; // (2)
> : return str;
> : }
> : void main() {
> : char* pStr = NULL;
> : pStr = getStr();
> : cout << pStr << endl;
> : }
> : 若照目前這樣編譯執行結果會印出string
> : 但若把(2)那行拿掉只留(1)那行則編譯(g++)會有warning:
> : address of local variable 'str' returned
> : 我一直把(1)和(2)的寫法看成一樣的
> : 看來是我觀念錯了
> : 請問這兩種寫法差在哪裡呢? 謝謝
--
☆ [Origin:椰林風情] [From: 220-135-94-155.hinet-ip.hin] [Login: **] [Post: 29]