※ 引述《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