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