==> jenniskuo.bbs@ptt.cc (冷暖) 提到:
> ※ 引述《swli.bbs@bbs.ntu.edu.tw (我喜歡寫程式)》之銘言:
> 不知道我這樣想對不對,
> 根據你所說的,
> char *str = "string"; 這個敘述代表 "str變數" 放在 stack 中,
> 而 "string" 本身是放在 heap 中.
> char str[] = "string"; 這個敘述代表 "str常數" 放在常數區段,
> 而 "string" 本身是放在 stack 中.
> 是嗎 ?
是的, 我的意思大體上就是這樣, 但沒有你說的放常數的區段.
藉此修正一個說法, char *str = "string"; 的 "string" 是不是在 heap 中,
我並沒有嚴格的去探究,主要的意思是它會被擺在一個安全可供存取的區段裡頭.
在char str[]="string"; 宣告中的str 常數, 並不需要放在常數區段或者任何
記憶體中, 它就只是個數字罷了. 這個數字或許你可以把它想像成一個標籤,
在編譯過程中, 只要用到這個常數, compiler 就會直接以這個值去計算記憶體
的參考位址.
當你直接採用 char str[] = "string"; 的方式宣告一個 local array 時
前面有網友也說了, compiler 的動作會類似 直接在 stack 中塞進 's',
't', 'r','i','n','g','\0x0', 並賦予 str 這個常數值為存放第一個字元
's' 的 memory address 值的常數意義.
> : 先不談 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 所疑惑的兩者之間的差異了.
--
☆ [Origin:椰林風情] [From: 61-222-153-46.hinet-ip.hine] [Login: **] [Post: 30]