※ 引述《Aligu1009.bbs@ptt.cc (=.=)》之銘言:
> 在下面的程式片段中
> 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)的寫法看成一樣的
> 看來是我觀念錯了
> 請問這兩種寫法差在哪裡呢? 謝謝
其實這是老問題了,
應該要有人整理成 FAQ。
"string" 會放在公用的 literal pool 裡面,
不會因為 function 被 call 或 return 就遭到破壞,
而且通常是 read only 的。
(1) 會在 stack 上 allocate 一塊大小為 strlen("string") 的空間,
然後把 "string" 這幾個字元含結尾的 NULL 複製到這個空間去,
當 getStr() return 時會傳回 str 這個 array 的起始位址,
可是這塊空間又會隨著 getStr() return 被釋放掉,
所以 compiler 會警告這是不安全的行為。
(2) 是直接把 literal pool 裡存放 "string" 的起始位址設給 str,
getStr() return 時不會破壞存放 "string" 的地方,
所以就不會有 warning。
--
Name: Tseng, Ling-hua E-mail Address: uranus@it.muds.net
School: National Tsing Hua University Department: Computer Science
Interesting: C++, Compiler, PL/PD, OS, VM, Large-scale software design
Researching: Undecided
Homepage: https://it.muds.net/~uranus
--
╔═══╗ ┼────────────────────────╮
║狂狷 ║ │* Origin:[ 狂 狷 年 少 ] whshs.cs.nccu.edu.tw ╰─╮
║ 年少║ ┼╮ < IP:140.119.164.252 > ╰─╮
╚╦═╦╝ ╰ * From:61-230-216-250.dynamic.hinet.net
─╨─╨─ KGBBS ─ ◎ 遨翔"BBS"的狂狷不馴;屬於年少的輕狂色彩 ◎