请问程序(C语言)的内存是如何分配的,堆是每个程序都共用的吗,而栈是每个程序都有一个吗

请问程序(C语言)的内存是如何分配的,堆是每个程序都共用的吗,而栈是每个程序都有一个吗,第1张

在win32下,堆和栈都是每个程序独立的升棚。

堆的分配的地址是由低到高的,栈的分配的地址是由高往低的。

栈一般是给函数的参数或局部变量使用的

堆差笑租一般是动态分虚兆配的内存

...................

第一个问题回答只有一个字“是”,建议你看一本书叫《程序员的自我修养》。

第二个问题:对SP寄存器的值进行 *** 作而形成逻辑上的栈,而局部变量是在函数内部定义的,就是在栈上定义的,函数的调用和对栈的 *** 作这是一个很基础的也是很重要的知识点,你把局部变量的释放理解成了一个单独的动作,事实上编译器没有对这个局部变量的空间做任何内存管理意义上的 *** 作。只是一个简单的对SP寄存器的值的一个改变即形成了栈的恢复缓橘动作。栈一恢复了,那之前那段栈内存上的数据你肯定找不到了,但那个物理内存地址上的数据却还是原状,所以我建义你把 ”自动释放局部变量“ 这几个字改成“自动丢弃局部变量”,丢了的东西就是找不回了,你没法用了,但那东西不会凭空从地球上消失,只是从你的视野里消失了,可能别人捡到了,别人就能用得着了,就像在函数A里创建的局部变量 local_a 可能在进程的地址空间里是地址0X11,但函数A返回之后,可能主程序又要调用函数B,而在函数B里创建的局部变量 local_b 也可能就是在0X11这个地址,那么地址0X11上边的值从A函数结束到B函数开始这段时间一直没变,只是在这段时间里没有人管理它的值。而这个过程就叫释放,或叫丢弃,

对堆内存的 *** 作实际是动态内存 *** 作,就涉及到内存管理了,其实现在的 *** 作系统内核对用户空间的进程这块的创建与注销都加入了内存保护,你在用户空间的程序中释不释放堆内存,系搏旦统都会在这个程序结束时做内存回收动作,扰银团但这仅限于用户空间的程序,如果是内核编程的话,就一定要严格释放掉动态分配的内存,否则造成系统内存泄漏,内存泄漏的后果就是可用内存被你人为的弄成了不可用内存,到最后导至系统无动态内存可分配,就无法加载程序。

对于你的提问,其实没有办法回答得让你理解透澈,你现在对程序的运行机制和 *** 作系统原理基本上是一个零的认识,慢慢来吧,多看 *** 作系统原理的书,其实用户程序都是基于 *** 作系统编程,理解一些原理性的东西是非常重要的。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12559934.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存