看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《flashliqu (投資自己)》之銘言: : 標題: Re: [問題] 關於return local pointer的問題 : 時間: Sun Jan 31 19:22:19 2010 : : ※ 引述《VictorTom (鬼翼&娃娃魚)》之銘言: : : ※ 引述《stellvia7 (stellvia)》之銘言: : : 後者是宣告一個ptr指標, 它會指向(儲存)一個const char string/array的位址.... : : 其內容為"123"; 查Wiki說, 它會存在Data Segment\Data Area\Read-Only Area.... : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ : 這邊有點疑問: : char *ptr = "123"; 應該是放在 literal pool 當中, : 應該是 Code segment 才對? : : -- : ※ 發信站: 批踢踢實業坊(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 做中學...剛剛寫了一段code... 1 void main(void) 2 { 3 char *s = "123"; 4 char *q = "123"; 5 6 printf("%s\n", s); 7 } gcc on cygwin上驗證 gcc aa.c -g -o aa # 產生aa.exe執行檔 objdump -S aa.exe | less # 反組譯執行檔 結果.... char *s = "123"; 40107a: c7 45 fc 00 20 40 00 movl $0x402000,-0x4(%ebp) char *q = "123"; 401081: c7 45 f8 00 20 40 00 movl $0x402000,-0x8(%ebp) "123"的字串儲存於 0x402000 的位址 再來.... objdump -h aa.exe 結果.... Idx Name Size VMA LMA File off Algn 0 .text 000003a8 00401000 00401000 00000400 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE 1 .rdata 00000008 00402000 00402000 00000800 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 0x402000是 rdata 地區.... 也就是說... char *p = "!@#$%^&*()_+"; 其字串本身會儲存 rdata。 至於其他編譯器於不同的OS,應該會針對它的特性做最佳安排。 但應該為會離太遠,甚至有一樣的結果 (這是私底下推測啦,有誤請補充) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.137.5.140
VictorTom:推謝 l大 的驗證測試....<(_ _)> 02/02 13:56