得0是因为在内存里的初始值都是为0
如数组里 你不赋值 就为0
好好活着,因为我们会死很久!!!
得0是因为在内存里的初始值都是为0
如数组里 你不赋值 就为0
不一定,有些编译器可以设置,在运行时初始化堆栈,也就是你声明的变量都会被初始化为0
而如果运行时不初始化堆栈的话,堆栈是一个不可预料的值。
原因是当你的程序被吊到内存的一个或多个页面中执行时(这个调度是系统完成的),如果这些页面中正好有个一个或多个页面被用于你这个程序的堆栈段,并且这个页面在你使用之前层被其他程序用作代码段、数据段或是堆栈段,当那个程序结束时,系统只是撤销了这个程序对该页面的使用权,回收了分配句柄,并没有将其内容清掉(由于清除页面内容需要相当的系统时间),为了不影响其他程序的响应时间,当你这个程序需要页面执行的时候,系统就把刚才回收的那个页面使用权给了你,不可预料的数据(称为垃圾数据)就是这样形成的。
对了,你可以看看我C++论坛的那个xcopy32完整实现的帖子,程序中提供了malloc,realloc,calloc,free函数的实现,这里我对页面的回收也仅仅是回收了使用的分配节点,并没有清掉内存池中的内容,原因就是不想影响运行效率。
int b不是定义在数据段里的
其实就是暂时给他分配的一个内存地址
当程序执行完 这个值就会被释放掉
也没用到堆栈
那你说说int b这个内存用到哪里去了?内存中程序的分布如下图:
[进程1[代码段][数据段][堆栈]][进程2[代码段][数据段][堆栈段]]。。。
进程与进程之间没有特殊手段是不能共享其数据的,对于系统的其他未使用内存,系统做保留,没有ring0权限是不能反问的,那你说说int b没有用堆栈,用数据段,那么b分配到了哪里了?
我不知道你是怎么理解的
我也不知道你对计算机里的内存分配是怎么理解的
可能和我理解的不同吧
在内存里 都有一个内存地址
int b;这一句 他就分配了一个2个字节的内存给他
不管他用没用 反正这个内存就分配给他了 一般情况下 初值为0
其实也是汇编里的数据段
b db ?
遗憾的是你还是没有说清楚b这个东西究竟用到了哪里的内存,而你在最后列出的汇编语句,承认b是使用得是数据段中的东西,好就以b在数据段中为例,那么数据段是否属于这个运行的程序呢?还有不能说是一般情况,这不是学理科学生应有的态度,我们要追求全面的解,每件事情从不同角度去思考;我来解释一下为什么大多数情况下会为0,因为默认设置编译生成的执行文件是调试版本的,调试版本强制运行前初始化堆栈,初始化数据段,强制页面对齐。最后还有个问题就是数据段属于这个程序,而程序被载入系统公共内存进行运行,那么数据段也被载入,原被那片区域留下的垃圾数据若正好对齐于该程序的数据段,若发布版本的执行文件并没有初始化数据段,那么留下的垃圾数据又会去哪里呢?
我们换个角度,看汇编的声明语句
b db ?
就算输出的b = 0那么为什么声明的时候不用b db 0而用b db ?,这里的?很明显表示,程序员并不知道初始化时b是什么值。
如果上面我所说的你全部不同意,那么为什么同样的程序我这里运行是一个不可预料的数据,这该怎么解释呢?
引用这句话“这个内存单元是电脑自动分配的”,还是这个问题,电脑从哪里分配,你的结论是“c程序”,那么c程序,那么最终还是回到了,这一块内存还是程序运行时告诉系统所要保留的那一块。
[进程[代码段1][代码段2]...[代码段n][数据段1][数据段2]....[数据段n][堆栈段1][堆栈段2]...[堆栈段n][附加段]]
其中数据段,堆栈段和附加段都不是必要的,但是他们都是属于进程的私有空间,而进程所占用的那段内存是系统分配的公共区域,然而你在进程中的各种变量声明和指针分配,都离不开这个进程空间;若果没有数据段、堆栈段、附加段、也就是一个com文件的原形,其实他的代码段也就可以作为数据段、堆栈段、和附加段,只是代码使用的那块区域不能在被分配使用;还有一点我没有说清楚,也就是如果进程又一条程序申请的内存大于了其保留的那块可以分配的内存,那么对于dos程序就会报错(stack overflow),而对于windows管理的程序,就会从空闲页面文件中进行交换。