标题:一道面试题
只看楼主
爱以走远
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:52
帖 子:7542
专家分:21
注 册:2007-3-16
得分:0 

得0是因为在内存里的初始值都是为0
如数组里 你不赋值 就为0


   好好活着,因为我们会死很久!!!
2007-09-03 18:52
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
得分:0 
以下是引用爱以走远在2007-9-3 18:52:44的发言:

得0是因为在内存里的初始值都是为0
如数组里 你不赋值 就为0

不一定,有些编译器可以设置,在运行时初始化堆栈,也就是你声明的变量都会被初始化为0
而如果运行时不初始化堆栈的话,堆栈是一个不可预料的值。

原因是当你的程序被吊到内存的一个或多个页面中执行时(这个调度是系统完成的),如果这些页面中正好有个一个或多个页面被用于你这个程序的堆栈段,并且这个页面在你使用之前层被其他程序用作代码段、数据段或是堆栈段,当那个程序结束时,系统只是撤销了这个程序对该页面的使用权,回收了分配句柄,并没有将其内容清掉(由于清除页面内容需要相当的系统时间),为了不影响其他程序的响应时间,当你这个程序需要页面执行的时候,系统就把刚才回收的那个页面使用权给了你,不可预料的数据(称为垃圾数据)就是这样形成的。

对了,你可以看看我C++论坛的那个xcopy32完整实现的帖子,程序中提供了malloc,realloc,calloc,free函数的实现,这里我对页面的回收也仅仅是回收了使用的分配节点,并没有清掉内存池中的内容,原因就是不想影响运行效率。


我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2007-09-03 19:00
爱以走远
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:52
帖 子:7542
专家分:21
注 册:2007-3-16
得分:0 
在调用堆栈里的时候当然就不一样拉
但是在这里没有用到堆栈
就如
main()
{int b;
printf("%d",b);
}
他运行出来的结果就为0

   好好活着,因为我们会死很久!!!
2007-09-03 19:04
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
得分:0 

int b; 你是不是认为是定义在数据段中的吗?b在c语言中只是个代号,被翻译以后就是一个内存地址。
其实不然,生成的目标代码一般为如下情况:
push bp
mov bp, sp;
dec bp, 2
这里流出来的两个字节的空间[bp]就是存放b的内容,也就是这个变量是被用在堆栈中划出来的。
所谓堆栈堆栈,是由堆和栈组成的,栈用来动态内存的分配,堆得增长和栈相反,用来划给静态变量。

还有就是这样程序的运行结果不是唯一的,我在VC里面运行有就是一个负数(也就是一个垃圾数据)


我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2007-09-03 19:11
爱以走远
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:52
帖 子:7542
专家分:21
注 册:2007-3-16
得分:0 

int b不是定义在数据段里的
其实就是暂时给他分配的一个内存地址
当程序执行完 这个值就会被释放掉
也没用到堆栈


   好好活着,因为我们会死很久!!!
2007-09-03 19:14
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
得分:0 
以下是引用爱以走远在2007-9-3 19:14:32的发言:

int b不是定义在数据段里的
其实就是暂时给他分配的一个内存地址
当程序执行完 这个值就会被释放掉
也没用到堆栈

那你说说int b这个内存用到哪里去了?内存中程序的分布如下图:
[进程1[代码段][数据段][堆栈]][进程2[代码段][数据段][堆栈段]]。。。
进程与进程之间没有特殊手段是不能共享其数据的,对于系统的其他未使用内存,系统做保留,没有ring0权限是不能反问的,那你说说int b没有用堆栈,用数据段,那么b分配到了哪里了?


我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2007-09-03 19:17
爱以走远
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:52
帖 子:7542
专家分:21
注 册:2007-3-16
得分:0 

我不知道你是怎么理解的
我也不知道你对计算机里的内存分配是怎么理解的
可能和我理解的不同吧
在内存里 都有一个内存地址
int b;这一句 他就分配了一个2个字节的内存给他
不管他用没用 反正这个内存就分配给他了 一般情况下 初值为0
其实也是汇编里的数据段
b db ?


   好好活着,因为我们会死很久!!!
2007-09-03 19:26
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
得分:0 
以下是引用爱以走远在2007-9-3 19:26:03的发言:

我不知道你是怎么理解的
我也不知道你对计算机里的内存分配是怎么理解的
可能和我理解的不同吧
在内存里 都有一个内存地址
int b;这一句 他就分配了一个2个字节的内存给他
不管他用没用 反正这个内存就分配给他了 一般情况下 初值为0
其实也是汇编里的数据段
b db ?

遗憾的是你还是没有说清楚b这个东西究竟用到了哪里的内存,而你在最后列出的汇编语句,承认b是使用得是数据段中的东西,好就以b在数据段中为例,那么数据段是否属于这个运行的程序呢?还有不能说是一般情况,这不是学理科学生应有的态度,我们要追求全面的解,每件事情从不同角度去思考;我来解释一下为什么大多数情况下会为0,因为默认设置编译生成的执行文件是调试版本的,调试版本强制运行前初始化堆栈,初始化数据段,强制页面对齐。最后还有个问题就是数据段属于这个程序,而程序被载入系统公共内存进行运行,那么数据段也被载入,原被那片区域留下的垃圾数据若正好对齐于该程序的数据段,若发布版本的执行文件并没有初始化数据段,那么留下的垃圾数据又会去哪里呢?
我们换个角度,看汇编的声明语句
b db ?
就算输出的b = 0那么为什么声明的时候不用b db 0而用b db ?,这里的?很明显表示,程序员并不知道初始化时b是什么值。
如果上面我所说的你全部不同意,那么为什么同样的程序我这里运行是一个不可预料的数据,这该怎么解释呢?


我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2007-09-03 19:40
爱以走远
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:52
帖 子:7542
专家分:21
注 册:2007-3-16
得分:0 

偶被你问得都不晓得怎么说拉
呵呵 其实这个好象也不是个什么复杂的问题
不过的确可能是因为我没说清楚 你上面说的其实也对
一个程序 他可以没有数据段 没有堆栈段 没有附加段 但是他一定有代码段
不过上面的那个b应该是在数据段里吧 其实也是给这个b分配的一个内存单元
这个内存单元是电脑自动分配的
但是在那个c程序里

   好好活着,因为我们会死很久!!!
2007-09-03 19:50
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
得分:0 
以下是引用爱以走远在2007-9-3 19:50:37的发言:

偶被你问得都不晓得怎么说拉
呵呵 其实这个好象也不是个什么复杂的问题
不过的确可能是因为我没说清楚 你上面说的其实也对
一个程序 他可以没有数据段 没有堆栈段 没有附加段 但是他一定有代码段
不过上面的那个b应该是在数据段里吧 其实也是给这个b分配的一个内存单元
这个内存单元是电脑自动分配的
但是在那个c程序里

引用这句话“这个内存单元是电脑自动分配的”,还是这个问题,电脑从哪里分配,你的结论是“c程序”,那么c程序,那么最终还是回到了,这一块内存还是程序运行时告诉系统所要保留的那一块。
[进程[代码段1][代码段2]...[代码段n][数据段1][数据段2]....[数据段n][堆栈段1][堆栈段2]...[堆栈段n][附加段]]
其中数据段,堆栈段和附加段都不是必要的,但是他们都是属于进程的私有空间,而进程所占用的那段内存是系统分配的公共区域,然而你在进程中的各种变量声明和指针分配,都离不开这个进程空间;若果没有数据段、堆栈段、附加段、也就是一个com文件的原形,其实他的代码段也就可以作为数据段、堆栈段、和附加段,只是代码使用的那块区域不能在被分配使用;还有一点我没有说清楚,也就是如果进程又一条程序申请的内存大于了其保留的那块可以分配的内存,那么对于dos程序就会报错(stack overflow),而对于windows管理的程序,就会从空闲页面文件中进行交换。


我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2007-09-03 20:00



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-167401-1-1.html




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

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