Re: [問題] 常數到底有沒有佔記憶體位置 by C

看板C_and_CPP作者 (takearest)時間14年前 (2010/07/23 17:43), 編輯推噓7(7010)
留言17則, 7人參與, 最新討論串2/2 (看更多)
※ 引述《rick (匿名的好友)》之銘言: : 如果有的話 要怎麼利用程式表示出來? : 請教各位高手 : 補個東西: : int *ptr=0; : 請問 "0" 到底是 "值" 還是 "記憶體位址" ??? : 我們老師說是 值 (私心認為: 0 指的是位址 Orz) : ptr ----> "0"的記憶體位址 : 指向 : 所以我才會困惑...常數到底有沒有記憶體位址 ?? 其實寫一個小程式產生link map檔,就可以解決你的疑惑了 以PC linux的環境當編譯環境, 用以下小程式為例子 //example.c #include <stdio.h> int *ptr=0; const int abc=123; main() { printf("abc=%d\n",abc); } 下編譯命令 gcc -static -Wl,-Map=map.txt example.c -o example 然後打開map.txt來看,你就會發現 常數abc是放在 .rodata 這個read only data segment,占四個byte空間 .rodata 0x0000000008094560 0x4 /tmp/ccyzrgwN.o 0x0000000008094560 abc 而變數ptr是放在bss segment ,占四個byte空間 .bss 0x00000000080a9d5c 0x4 /tmp/ccyzrgwN.o 0x00000000080a9d5c ptr 因為loader會把bss segment initial為0, 剛好可以放變數ptr, 所以應把0視為變數ptr的值 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.120.188.59

07/23 18:28, , 1F
推~~ 不過小弟我在猜, 原po想問的是, 以本例來說,
07/23 18:28, 1F

07/23 18:29, , 2F
改成 int abc = 123; // 這個 123 有沒有佔用記憶體??
07/23 18:29, 2F
若是int abc=123; 變數abc會被擺在data segment且值就是123, 占四個byte, run example code時,loader會把123搬到RAM 讓程式用~ ※ 編輯: takearest 來自: 59.120.188.59 (07/23 18:54)

07/23 19:12, , 3F
可是我又猜二樓想講的是 function 內寫那行的狀況 XD
07/23 19:12, 3F

07/23 19:23, , 4F
放堆疊中?
07/23 19:23, 4F

07/23 20:45, , 5F
除非宣告成static,否則都是在堆疊
07/23 20:45, 5F

07/23 20:49, , 6F
他應該是想問左值跟右值的差異吧
07/23 20:49, 6F
沒錯,local variable是放在stack 再補充一個case, 若宣告全域變數 int abc; 未給起始值, 則變數放在bss segment, 且在main function內 把常數123給abc, 這個常數123是存在 code instruction的operand內, run-time在搬到abc內 ※ 編輯: takearest 來自: 111.251.210.39 (07/23 21:45)

07/23 21:49, , 7F
windows沒有bss
07/23 21:49, 7F

07/24 00:30, , 8F
被3F t大猜對了XD 也再次感謝這篇的t大的解釋:)
07/24 00:30, 8F

07/24 00:30, , 9F
話說回來, 在code inst.的operand內, 這樣其實好像也算
07/24 00:30, 9F

07/24 00:31, , 10F
有佔用到記憶體吼....Orz
07/24 00:31, 10F

07/26 12:40, , 11F
windows 也有 bss 呀 (尖叫
07/26 12:40, 11F

07/26 12:41, , 12F
用 dumpbin 就看得到了
07/26 12:41, 12F

07/29 23:10, , 13F
123不就是被編成機械碼放在code section內
07/29 23:10, 13F

07/29 23:13, , 14F
然後程式執行時,被以機械碼的形式載入記憶體
07/29 23:13, 14F

07/29 23:14, , 15F
等執行到那段機械碼時,會被存到abc變數的記憶體位址
07/29 23:14, 15F

07/29 23:18, , 16F
x86組語 mov dword ptr [abc],7Bh 對應的機械碼
07/29 23:18, 16F

07/31 02:07, , 17F
樓上正姐
07/31 02:07, 17F
文章代碼(AID): #1CIMGuPl (C_and_CPP)
文章代碼(AID): #1CIMGuPl (C_and_CPP)