20200925:堆,申请了一堆空间等着程序员开发;栈,和客栈,栈道一样,预先组织好的东西。不知道为什么总是混淆堆栈,(。・∀・)ノ゙
经常遇到这样的困扰,我们写的代码在计算机中都存放在哪呢?这篇文章给了一个比较清晰的回答。
C/C++中内存模型
这里自己重新抄了一遍。C++内存分为5个区域(堆栈全常代 ):
- 堆 heap 动态申请的、程序员自治的一片内存区域,程序结束时资源可能被回收[1]。涉及的问题:“缓冲区溢出”、“内存泄露”
- 栈 stack 编译器管理的一片内存区域。如局部变量、函数参数。函数返回局部变量会回收。
- 全局/静态存储区 (.bss段和.data段) 也称为数据区(Data Segment),可以分为初始化数据区和未初始化数据区。初始化数据区又可以分为只读和可读可写区,如:
static int i=0
const static double a=3.14
;未初始化区中的变量是指用户未给定初值的全局或者静态变量,编译器将会将其默认初始化为0。全局和静态变量被分配到同一块内存中。在C语言中,未初始化的放在.bss段中,初始化的放在.data段中;在C++里则不区分了。 - 常量存储区 (.rodata段) 存放常量,不允许修改(通过非正当手段也可以修改)
- 代码区 (.text段) 代码段(text Segment/code Segment)包含了可执行指令,是目标程序或者内存的一部分。该段区域是只读的,防止程序意外改变其中的指令。
[1] 取决于操作系统是否支持 [2] https://www.geeksforgeeks.org/memory-layout-of-c-program/