静态数据区数据分配的问题
有如下程序,在VC6.0下编译运行:
int n = 0;
int *pn = &n;
int main(int argc, char* argv[])
{
printf("\n &n = %d", &n);
printf("\n &pn = %d", &pn);
getch();
return 0;
}
运行结果如下:
&n = 4340464
&pn = 4336448
问 1:为什么n与pn地址相差如此远,不都是在静态存储区分配的吗?
如果将程序作如下修改:
int n = 0;
int *pn;
int main(int argc, char* argv[])
{
pn = &n;
printf("\n &n = %d", &n);
printf("\n &pn = %d", &pn);
getch();
return 0;
}
就得到了如下结果:
&n = 4340444
&pn = 4340440
问 2: 现在n与pn的地址是相邻的,但为什么n的地址会在pn的地址后面?
又有如下程序:
int n;
int n1;
int main(int argc, char* argv[])
{
printf("\n &n = %d", &n);
printf("\n &n1 = %d", &n1);
getch();
return 0;
}
输出结果:
&n = 4340164
&n1 = 4340160
而如果将前两行修改为:
int n = 0;
int n1= 1;
则输出结果为:
&n = 4340160
&n1 = 4340164
问 3: 为什么初始化与不初始化会导致地址顺序相反?
望dx解惑,感激不尽!
问题点数:100、回复次数:32Top
1 楼wtzyb4446(不死鸟)回复于 2004-09-03 10:45:49 得分 0
自己顶先Top
2 楼liushuaiboy(标准菜鸟)回复于 2004-09-03 10:57:10 得分 0
帮顶~Top
3 楼liushuaiboy(标准菜鸟)回复于 2004-09-03 10:58:59 得分 0
楼主把第一个程序改为
int n = 0;
int *pn = &n;
int main(int argc, char* argv[])
{
printf("\n &n = %d", &n);
printf("\n &pn = %d", pn);
getch();
return 0;
}
看看,呵呵Top
4 楼liushuaiboy(标准菜鸟)回复于 2004-09-03 11:00:39 得分 0
不好意思,看错了,汗!Top
5 楼wtzyb4446(不死鸟)回复于 2004-09-03 11:01:41 得分 0
to liushuaiboy(标准菜鸟) :
我是关心pn本身的地址,而不是它的值,它的值其实就是n的地址,你这样修改之后,两行输出的值是一样的。Top
6 楼DiabloWalkOnTheEarth(我想到个绝妙的昵称,只是地方太小,写不下)回复于 2004-09-03 12:06:00 得分 40
int n = 0;
int *pn = &n;
------------------------------------------------
因为 n = 0 , n 就被放到 _BSS 段了, 而 pn 被放到了 _DATA 段,当然地址相差就很远了
改成
int n = 1; int *pn = &n; 则两者都放在 _DATA 段,应该地址就是相临的了
Top
7 楼wtzyb4446(不死鸟)回复于 2004-09-03 12:32:17 得分 0
to: DiabloWalkOnTheEarth(毁灭小符 (Annihilus)(99)(3502)):
果如所言,多谢!Top
8 楼DiabloWalkOnTheEarth(我想到个绝妙的昵称,只是地方太小,写不下)回复于 2004-09-03 12:32:41 得分 0
同样,中间两种情况下,两个变量都在 _BSS 段,因此地址相邻,不过为什么是倒序就不清楚了
int n = 0;
int n1= 1;
----------------------------------------
n 在 _BSS 段, n1 在 _DATA 段,两个变量应该不会相邻的,如果真的相邻了,大概是撞大运撞上了吧Top
9 楼bm1408(向va_list学习~不用VC好多年~)回复于 2004-09-03 13:04:03 得分 0
int n = 0;
int *pn = &n;
int main(int argc, char* argv[])
{
printf("\n &n = %d", &n);
printf("\n &pn = %d", &pn);
getch();
return 0;
}
---
Top
10 楼bm1408(向va_list学习~不用VC好多年~)回复于 2004-09-03 13:04:17 得分 10
因为 n = 0 , n 就被放到 _BSS 段了, 而 pn 被放到了 _DATA 段,当然地址相差就很远了
改成
int n = 1; int *pn = &n; 则两者都放在 _DATA 段,应该地址就是相临的了
Top
11 楼bm1408(向va_list学习~不用VC好多年~)回复于 2004-09-03 13:05:21 得分 0
_bbs
-data
Top
12 楼huangyang88(中国-必胜)回复于 2004-09-03 14:32:57 得分 0
楼上的都说了,我来接分Top
13 楼wtzyb4446(不死鸟)回复于 2004-09-03 14:42:17 得分 0
to DiabloWalkOnTheEarth(毁灭小符 (Annihilus)(99)(3502)) :
不是 int n = 0;
int n1 = 1;
是我敲错了,都等于0;
不过都不赋初值的话,地址顺序确实是相反的,我再次证实了一下。Top
14 楼DiabloWalkOnTheEarth(我想到个绝妙的昵称,只是地方太小,写不下)回复于 2004-09-03 14:59:16 得分 0
呵呵,好像是这样的
不过奇怪的是我看了一下
int n = 0;
int n1 = 0;
和
int n;
int n1;
生成的list 文件是一样的,不知道怎么会运行起来不同,咔咔, 看来这些还是不要关心的好Top
15 楼sunlu_eric(天使预备役)回复于 2004-09-03 15:08:01 得分 0
学习中!!!!
谢谢!Top
16 楼xteaj(半桶水)回复于 2004-09-03 15:27:43 得分 0
这些都与编译器的优化有关,关掉所有的优化选项试试看。Top
17 楼steveyzhang(keepthefaith)回复于 2004-09-03 15:58:53 得分 0
_BSS 段 ? _DATA 段 ?小弟不解,谁能说得更详细些,谢谢了Top
18 楼DiabloWalkOnTheEarth(我想到个绝妙的昵称,只是地方太小,写不下)回复于 2004-09-03 17:52:18 得分 0
_BSS 未初始化数据区.
_DATA 初始化数据区.Top
19 楼Zark(金陵五月)回复于 2004-09-04 02:34:22 得分 0
我来解释一下"为什么其地址是倒序的".
学过计算机原理的人都应该知道,在内存中有两种结构,一是堆,二是栈,其使用内存的方法是"栈往上涨,堆往下生".全局及静态变量区是堆结构,所以先定义的变量其地址大.
| | 0x40000
| |
| | 0x20000
| |
|_____| 0x1
(内存映像)
Top
20 楼somedummy(某人马甲)回复于 2004-09-04 03:32:25 得分 0
楼上肯定没仔细看楼猪说的话,楼猪问的是为什么不初始化和初始化两个顺序不一样……
另外,楼上为什么总是深夜出现?装鬼吓人?Top
21 楼somedummy(某人马甲)回复于 2004-09-04 03:35:09 得分 0
另外,堆栈好象说反了……Top
22 楼wtzyb4446(不死鸟)回复于 2004-09-05 10:51:31 得分 0
不知道有没有人能解释为什么不初始化和初始化两个顺序不一样?
如果没有的话,只好结贴了!Top
23 楼wtzyb4446(不死鸟)回复于 2004-09-05 10:54:40 得分 0
to somedummy(某人马甲):
拜托不要敲错别字好不好,虽然我好吃懒做,还有点胖,不过毕竟是个人,不是...Top
24 楼xteaj(半桶水)回复于 2004-09-05 11:02:31 得分 20
运行的结果都只能是编译器分配空间的一种情形。
编译器针对不同的情形有不同的分配算法,
我们在不知道分配算法(编译器制造者才知道)的情形下是讨论不清的,
何况还有优化问题,我们就更想不清楚了。
我在DEV-C++中运行的结果地址的顺序没变,但位置相差比较远。Top
25 楼hewittlee(只爱C++)回复于 2004-09-05 11:14:00 得分 0
内存堆栈问题!Top
26 楼xqlez(&引用)回复于 2004-09-05 11:17:14 得分 0
不初始化的放在.bss中,
初始化的放在.data中,
Top
27 楼xqlez(&引用)回复于 2004-09-05 11:21:24 得分 10
DEV-C++
把初始化为0当做不初始化,
所以位置相差比较远Top
28 楼wwwooowww(熔点)回复于 2004-09-05 11:43:57 得分 10
:.text(正文段)包含程序的指令代码;.data(数据段)包含固定的数据,如常量、字符串;.bss(未初始化数据段)包含未初始化的变量、数组等。Top
29 楼wangyangcheng(矛盾)回复于 2004-09-05 13:10:03 得分 0
mark.Top
30 楼darkwanderer(一个人到处走)回复于 2004-09-06 15:53:59 得分 10
http://community.csdn.net/Expert/topic/3215/3215569.xml?temp=.3182337
low address
+--------------------------------+
| _TEXT class 'CODP' |
| code |
+--------------------------------+--
| _DATA class 'DATA' |
| initialized data |
+--------------------------------+ DGROUP
| _BSS class 'BSS' |
| uninitialized data |
+--------------------------------+--
| |
| FREE SPACE |
+--------------------------------+
| |
| STACK |
+--------------------------------+
| |
| HEAP |
+--------------------------------+
| |
| FREE SPACE |
+--------------------------------+
high address
Top
31 楼junmayang(笨猪)回复于 2004-09-06 16:22:30 得分 0
牛!Top
32 楼wtzyb4446(不死鸟)回复于 2004-09-07 20:40:06 得分 0
结贴!Top




