C和C++的内存布局

简介1.1 内存分布图 Stack段:局部变量存放区域。 heap段:用户动态分配内存区域。 bss段:存放未初始化的全局或静态变量内存区域。(Block Started by Symbol) 数据段:通常指存放已初始化的全局变量的内存区域。(data segment) 代码段:通常指存放程序执行代码的一块内存区域。(code segment/text segment) 1.2 在C中分为5个存储区(内存布局) (1)栈区(stack):由编译器自动分配释放,存放函数的参

1.1 内存分布图
在这里插入图片描述
Stack段:局部变量存放区域。
heap段:用户动态分配内存区域。
bss段:存放未初始化的全局或静态变量内存区域。(Block Started by Symbol)
数据段:通常指存放已初始化的全局变量的内存区域。(data segment)
代码段:通常指存放程序执行代码的一块内存区域。(code segment/text segment)

1.2 在C中分为5个存储区(内存布局)

(1)栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量等。其操作方式类似数据结构中的栈。
(2)堆区(heap):一般有程序员分配释放,若程序员不释放,程序结束时由系统释放。与数据结构的堆毫无关系,分配方式类似于链表。malloc,alloc,realloc
(3)全局/静态区:全局变量和静态变量的存储是在一块的。初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域
(4)文字常量区:常量和字符串就是存放在这里。程序结束后由系统释放。
(5) 程序代码区:存放函数体的二级制代码

总结:
(1)数题中定义的变量通常在栈上,
(2)用malloc,calloc,realloc等分配内存的函数分配得到的对象就在堆上。
(3)所有函数体外定义的变量就是全局变量,加了static修饰符后不管在哪里都存放在全局(静态区),全局的static变量只对该文件中有效,不能extern到别的文件用,在函数体内部定义的static表示在该函数体内邮箱。另外,函数体中的“abcdef”这样的字符串存放在常量区。



1.3 在C++中分为5个存储区(内存布局)
(1)栈区:局部变量,函数传参值,自动释放,效率高但内存少
(2)堆区:malloc函数从堆上申请内存,用free释放内存,若不释放,程序结束释放
(3)自由存储区:自由存储区是C++基于new操作符的一个抽象概念。new操作符在此申请内存,用delete释放内存,若不释放,程序结束释放
(4)全局/静态区:存储全局变量或静态变量。内存在编译时就分配好了(程序执行前),整个程序运行期间都存在,程序结束时释放。
(5)常量存储区:存储常量(const),不允许修改。

本文转自:https://blog.csdn.net/zy47675676/article/details/89215794