精華區beta Programming 關於我們 聯絡資訊
※ 引述《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"的狂狷不馴;屬於年少的輕狂色彩