Re: [問題] 常數到底有沒有佔記憶體位置 by C
※ 引述《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
07/23 18:28, 1F
→
07/23 18:29, , 2F
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
07/23 19:12, 3F
→
07/23 19:23, , 4F
07/23 19:23, 4F
推
07/23 20:45, , 5F
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
07/23 21:49, 7F
推
07/24 00:30, , 8F
07/24 00:30, 8F
→
07/24 00:30, , 9F
07/24 00:30, 9F
→
07/24 00:31, , 10F
07/24 00:31, 10F
推
07/26 12:40, , 11F
07/26 12:40, 11F
→
07/26 12:41, , 12F
07/26 12:41, 12F
→
07/29 23:10, , 13F
07/29 23:10, 13F
→
07/29 23:13, , 14F
07/29 23:13, 14F
→
07/29 23:14, , 15F
07/29 23:14, 15F
→
07/29 23:18, , 16F
07/29 23:18, 16F
推
07/31 02:07, , 17F
07/31 02:07, 17F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):