| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1463 人关注过本帖
标题:[讨论]变量地址分配的疑惑
只看楼主 加入收藏
blackorchis
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2006-7-4
收藏
 问题点数:0 回复次数:10 
[讨论]变量地址分配的疑惑
许多课本上有如下解释:程序在编译时,编译器为每一个动态变量分配唯一的地址。
但是又有:对于动态变量,只有函数被调用时,才分配空间。
问题是:函数被调用时分配的空间的地址难道与编译时分配的唯一的地址不一样?
我的理解是:在编译阶段,编译器为每一个动态变量分配唯一的地址,这时的地址只是“虚”的,就像我们买的火车票上的座位号一样。而函数调用时分配的地址,就像我们上车时坐的实际的座位号,也许中途有人下车,因此可以动态地选择可用的座位。这个比方的前提当然是假设火车票在同一时间售出。

不知以上理解可否合理,请各位指教!
搜索更多相关主题的帖子: 变量 火车票 地址 动态 座位号 
2007-09-06 21:11
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
收藏
得分:0 
你的理解不正确,书的解释也不妥当


对于动态变量,当运行到动态变量所在的作用域(一般是所在的那层大括号)时,
才分配空间,在退出作用域前变量的地址是唯一且不会变化的,
但下一次再次运行到相同作用域时,变量地址很可能与上次的地址不一样



by 雨中飞燕 QQ:78803110 QQ讨论群:5305909

[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url]
C/C++算法习题(OnlineJudge):[url]http://yzfy.org/[/url]
2007-09-06 21:31
交流者
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2007-9-5
收藏
得分:0 
回复:(blackorchis)[讨论]变量地址分配的疑惑
我认为函数被调用时分配的空间的地址与编译时分配的唯一的地址是一样的.因为函数被调用时应该就是编译器为变量分配地址的时候.另外动态变量意思是他的作用域只在定义和说明他的函数内,一旦他离开函数,他所分配的内存单元将被释放,并不是你所说的可以动态的选择内存地址.
2007-09-06 21:38
blackorchis
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2006-7-4
收藏
得分:0 
回复:(blackorchis)[讨论]变量地址分配的疑惑
答2楼:

对于动态变量,当运行到动态变量所在的作用域(一般是所在的那层大括号)时,
才分配空间,在退出作用域前变量的地址是唯一且不会变化的,
但下一次再次运行到相同作用域时,变量地址很可能与上次的地址不一样

我的问题是:如你所说“在退出作用域前变量的地址是唯一且不会变化的”,说明这些变量还占有空间?!
2007-09-07 08:49
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
收藏
得分:0 
运行到作用域里的时候就占有空间,否则空间就会释放



by 雨中飞燕 QQ:78803110 QQ讨论群:5305909

[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url]
[url=http://bbs.bc-cn.net/viewthread.php?tid=162918]C++编写的Windows界面游戏[/url]
[url=http://yzfy.org/]C/C++算法习题(OnlineJudge):[/url] http://yzfy.org/

[此贴子已经被作者于2007-9-7 9:25:59编辑过]

2007-09-07 09:24
zgx_921
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-9-4
收藏
得分:0 

飞燕说的对,动态变量都是在栈里的,作用域结束,栈被销毁,变量也就不复存在了包括它的地址


2007-09-07 09:51
blackorchis
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2006-7-4
收藏
得分:0 
回2楼和6楼:
作一个非常简单但又略显笨拙的假设:如果只有60个字节的可分配空间,我们在两个程序块中分别定义了一个char a[40]和char b[40],显然这两个数组不会同时占用内存空间,但编译能通过吗?因为如果编译器在编译时为每一个动态变量分配唯一的地址,很显然,地址不够用!
2007-09-07 10:26
wzhgzj
Rank: 1
等 级:新手上路
帖 子:108
专家分:0
注 册:2007-9-6
收藏
得分:0 
支持7楼的

命运在我手中
2007-09-07 10:41
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
收藏
得分:0 
7楼这种情况在通常环境下不会存在,因为栈空间并不小,绝不会只有60字节
如果你一定要分配一个超过栈空间大小的数组,则会发生运行时错误(栈溢出)




by 雨中飞燕 QQ:78803110 QQ讨论群:5305909

[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url]
[url=http://bbs.bc-cn.net/viewthread.php?tid=162918]C++编写的Windows界面游戏[/url]
[url=http://yzfy.org/]C/C++算法习题(OnlineJudge):[/url] http://yzfy.org/
2007-09-07 12:21
blackorchis
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2006-7-4
收藏
得分:0 
所以,我的理解是:编译时,为每一个动态变量分配唯一的地址,而当程序运行时,动态地获得存储空间!
另一问题:如果有递归调用,而递归的次数在程序运行时决定(由用户输入),在调用的过程中,所有的参数要入栈,而这些参数的数目在编译时根本无法知道,更谈不上分配唯一的地址了,不知道如何理解?!

[此贴子已经被作者于2007-9-7 12:40:31编辑过]

2007-09-07 12:29
快速回复:[讨论]变量地址分配的疑惑
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017270 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved