作者VictorTom (鬼翼&娃娃魚)
看板C_and_CPP
標題Re: [問題] 關於return local pointer的問題
時間Sat Jan 30 01:49:24 2010
※ 引述《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....
所以後者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: 220.132.174.98
※ 編輯: VictorTom 來自: 220.132.174.98 (01/30 02:02)
推 kkroy:專業推! 01/30 13:20
推 taiwan2000:好厲害! 01/30 14:59
→ loveme00835:推專業! 01/30 15:56
推 bil193:看到m才看來 發現是清晰好文 02/01 14:38
推 stellvia7:剛溫 清楚多了 02/01 15:53
推 masan22305:有看有推!! 04/30 22:18