精華區beta Programming 關於我們 聯絡資訊
※ 引述《swli.bbs@bbs.ntu.edu.tw (我喜歡寫程式)》之銘言: : ==> ykjiang.bbs@ptt.cc (Yukuan) 提到: 不知道我這樣想對不對, 根據你所說的, char *str = "string"; 這個敘述代表 "str變數" 放在 stack 中, 而 "string" 本身是放在 heap 中. char str[] = "string"; 這個敘述代表 "str常數" 放在常數區段, 而 "string" 本身是放在 stack 中. 是嗎 ? : 先不談 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 所疑惑的兩者之間的差異了. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.64.26.200