C/C++编译的程序占用内存的分配如图:
栈区(stack):由系统自动分配,一般存放函数参数值、局部变量的值等。由编译器自动创建与释放。其操作方式类似于数据结构中的栈,即后进先出、先进后出的原则。
例如:在函数中申明一个局部变量
int b;系统自动在栈中为b开辟空间。堆区(heap):一般由程序员申请并指明大小,最终也由程序员释放。如果程序员不释放,程序结束时可能会由OS回收。对于堆区的管理是采用链表式管理的,操作系统有一个记录空闲内存地址的链表,当接收到程序分配内存的申请时,操作系统就会遍历该链表,遍历到一个记录的内存地址大于申请内存的链表节点,并将该节点从该链表中删除,然后将该节点记录的内存地址分配给程序。
例如:在C中malloc函数
char p1;
p1 = (char )malloc(10);
但是p1本身是在栈中的。
- 全局区/静态区:顾名思义,全局变量和静态变量存储在这个区域。只不过初始化的全局变量和静态变量存储在一块,未初始化的全局变量和静态变量存储在一块。程序结束后由系统释放。
- 文字常量区:这个区域主要存储字符串常量。程序结束后由系统释放。
- 程序代码区:这个区域主要存放函数体的二进制代码。
程序在运行期间,地址空间一直都存在。

本文介绍了C/C++程序中内存分配的各个区域,重点解析了函数调用时栈区如何形成栈帧的过程,包括栈的运作原理、寄存器的作用以及函数调用的步骤。通过示例代码展示了函数实现两个数相加的操作,强调了栈向下生长的特性以及数据读取方式。
最低0.47元/天 解锁文章
6957

被折叠的 条评论
为什么被折叠?



