作者flashliqu (投資自己)
看板C_and_CPP
標題Re: [問題] 關於return local pointer的問題
時間Sun Jan 31 19:22:19 2010
※ 引述《VictorTom (鬼翼&娃娃魚)》之銘言:
: ※ 引述《stellvia7 (stellvia)》之銘言:
: : 關於return local pointer的問題
: 好像搞得有點亂了, 乾脆直接回一篇出來好了....
: 簡單的說, 你要搞清楚回傳出function的東西來自何處....
: 另外就是, 分清楚討論的是指標變數本身, 還是存的值....
: ==
: int* func(void)
: {
: int iLocal;
: int *ptr = &iLocal;
: return ptr;
: }
: int* func(void)
: {
: int *ptr = (int*) malloc(sizeof(int) * 10);
: return ptr;
: }
: 這兩個例子裡, ptr變數都是local var, 所以都會放在stack....
: 但是caller收到的回傳結果, 前者是有問題的, 後者是可用的....
: 前者ptr記錄的位址是iLocal變數的位址, 因為iLocal是放在stack上的local var....
: 所以將它的address回傳給caller, caller拿到這address也不是一個可用的東西....
: 後者ptr記錄的位址是malloc回來放在heap的address....
: 所以caller拿到這個address原則上會是可用的東西....
: ==
: char* func(void)
: {
: char ptr[] = "123";
: return ptr;
: }
: char* func(void)
: {
: char *ptr = "123";
: return ptr;
: }
: 這兩個例子裡, ptr一樣都是放在stack裡的local var, 一樣都沒malloc用heap....
: 但是雖然前者同樣會有問題, 但是後者回傳的address卻是可用的, 這是為什麼呢??
: 前者是宣告一個ptr陣列, 並且init成'1''2''3''\0', 它是local var array....
: 所以return回去的, 還是一個存在stack上的address, 所以是個不可用的東西....
: 後者是宣告一個ptr指標, 它會指向(儲存)一個const char string/array的位址....
: 其內容為"123"; 查Wiki說, 它會存在Data Segment\Data Area\Read-Only Area....
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
這邊有點疑問:
char *ptr = "123"; 應該是放在 literal pool 當中,
應該是 Code segment 才對?
: 所以後者ptr雖然是個放在stack的local var, 記錄的卻是Data Area的address....
: 因此caller拿到的還是個可用的東西; 題外話, 這是只能讀不能寫的一段memory....
: ==
: 注意func return的是var ptr的值(指到的位址)
: 所以問題重點不在於ptr它是不是local var....
: 而是它存的address來自何方, 這才是caller拿到的東西可不可用的關鍵:)
: 補上Wiki的網址 - http://en.wikipedia.org/wiki/Data_segment
: 裡面還有描述關於global var或static var的segment, 請自理XD
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.42.1.144
推 VictorTom:mm~~有可能是小弟我誤把那段描述global/static var的描 01/31 23:46
→ VictorTom:述誤解讀成一般function也是了; 只是連去code segment也 01/31 23:49
→ VictorTom:沒看到類似的例子, 具體文獻就有勞其他大大了<(_ _)> 01/31 23:50