精華區beta Programming 關於我們 聯絡資訊
==> 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]