推 VictorTom:推謝 l大 的驗證測試....<(_ _)> 02/02 13:56
※ 引述《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