程序的静态存储区,动态存储区和堆以及栈的关系是什么?
一、程序的静态存储区,动态存储区和堆以及栈的关系
堆不是在静态存储区的,是属于动态存储区的。所谓静态,就是一定会存在的而且会永恒存在、不会消失,这样的数据包括常量、常变量(const 变量)、静态变量、全局变量等。
动态的话,就是会变化的了。动态的区域,就是堆和栈。这个栈应该称作 call stack,上面会存放函数的返回地址、参数和局部变量。而堆放就是我们通过 new 算符和 malloc 函数分配得到的空间。这些段在内存中分配位置,跟硬件架构和操作系统都有关系,x86中栈都是由高地址向低地址分配,堆是由低地址向高地址分配,不过在 Windows 和 Linux 中堆和栈的位置相反,另外存放静态数据、代码的区域位置也有一些不同。
另外,栈是属于线程的,每一个线程会有一个自己的栈。
延伸阅读:
二、数据段
由三部分组成。
只读数据段
只读数据段是程序使用的一些不会被更改的数据,使用这些数据的方式类似查表式的操作,由于这些变量不需要更改,因此只需要放置在只读存储器中即可。一般是const修饰的变量以及程序中使用的文字常量一般会存放在只读数据段中。
已初始化的读写数据段
已初始化数据是在程序中声明,并且具有初值的变量,这些变量需要占用存储器的空间,在程序执行时它们需要位于可读写的内存区域内,并且有初值,以供程序运行时读写。在程序中一般为已经初始化的全局变量,已经初始化的静态局部变量(static修饰的已经初始化的变量)
未初始化段(BSS)
BSS段通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。
特点是可读写的,在程序执行之前BSS段会自动清0。
未初始化数据是在程序中声明,但是没有初始化的变量,这些变量在程序运行之前不需要占用存储器的空间。与读写数据段类似,它也属于静态数据区。但是该段中数据没有经过初始化。未初始化数据段只有在运行的初始化阶段才会产生,因此它的大小不会影响目标文件的大小。在程序中一般是没有初始化的全局变量和没有初始化的静态局部变量。

相关推荐HOT
更多>>
linux的图形输入命令?
linux,按了ctrl+alt+F1,进入了类似纯命令行的界面,让输入login信息,怎么...1、是进入了linux控制台字符终端环境,要回到图形控制台,按 Ctrl + ...详情>>
2023-10-21 22:37:07
linux进入命令方式?
linux的进入磁盘命令1、查看磁盘空间 -df df命令以磁盘分区为单位查看文件系统中磁盘空间的使用情况。2、Linux系统在使用光盘、软盘或U盘时,必...详情>>
2023-10-21 19:51:43
linux永久挂载的命令?
Linux实现硬盘永久挂载,怎么查看有没有永久挂载?1、主要就是编辑文件 /etc/fstab,把需要永久挂载的磁盘号对应的目录写入此文件内,保存退出重...详情>>
2023-10-21 19:28:23
linux定时清理命令?
Linux定时删除日志文件/文件夹使用crontab命令生成定时任务,每天shell脚本可以自动进行日志清理。为了避免手工删除日志,考虑通过写shell脚本...详情>>
2023-10-21 16:33:28