看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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