C/C++程序中全局变量局部变量堆栈的存储区域介绍
Posted ZSYL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++程序中全局变量局部变量堆栈的存储区域介绍相关的知识,希望对你有一定的参考价值。
C/C++程序中全局变量、局部变量、堆、栈的存储区域介绍
区域的介绍
C语言在内存中一共分为如下几个区域:
区域 | 作用 |
---|---|
内存栈区 | 存放局部变量名 |
内存堆区 | 存放new或者malloc出来的对象 |
常数区 | 存放局部变量或者全局变量的值 |
静态区 | 用于存放全局变量或者静态变量 |
代码区 | 二进制代码 |
区域的解释
- 栈区(stack)–由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
- 堆区(heap)–般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式类似于链表。
- 全局区(静态区)(static)–全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域(RW),未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(ZI)。程序结束后有系统释放。 和“栈”一样,通常是用于那些在编译期间就能确定存储大小的变量的存储区,但它用于的是在整个程序运行期间都可见的全局变量和静态变量。
- 文字常量区–常量字符串就是放在这里的。程序结束后由系统释放 (RO)
- 程序代码区–存放函数体的二进制代码。 (RO)
- 常量存储区—和“全局/静态存储区”一样,通常是用于那些在编译期间就能确定存储大小的常量的存储区,并且在程序运行期间,存储区内的常量是全局可见的。这是一块比较特殊的存储去,他们里面存放的是常量,不允许被修改。
内存存在两种属性:静态分配内存和动态分配内存。
- 静态分配内存:是在程序编译和链接时就确定好的内存。
- 动态分配内存:是在程序加载、调入、执行的时候分配/回收的内存。
堆栈
堆和栈都是动态分配内存,两者空间大小都是可变的。
Stack: 栈,存放Automatic Variables,按内存地址由高到低方向生长,其最大大小由编译时确定,速度快,但自由性差,最大空间不大。
通常是用于那些在编译期间就能确定存储大小的变量的存储区,用于在函数作用域内创建,在离开作用域后自动销毁的变量的存储区。通常是局部变量,函数参数等的存储区。他的存储空间是连续的,两个紧密挨着定义的局部变量,他们的存储空间也是紧挨着的。栈的大小是有限的,通常Visual C++编译器的默认栈的大小为1MB,所以不要定义int a[1000000]这样的超大数组。
Heap: 堆,自由申请的空间,按内存地址由低到高方向生长,其大小由系统内存/虚拟内存上限决定,速度较慢,但自由性大,可用空间大。
通常是用于那些在编译期间不能确定存储大小的变量的存储区,它的存储空间是不连续的,一般由malloc(或new)函数来分配内存块,并且需要用free(delete)函数释放内存。如果程序员没有释放掉,那么就会出现常说的内存泄漏问题。需要注意的是,两个紧挨着定义的指针变量,所指向的malloc出来的两块内存并不一定的是紧挨着的,所以会产生内存碎片。另外需要注意的一点是,堆的大小几乎不受限制,理论上每个程序最大可达4GB。
每个线程都会有自己的栈,但是堆空间是共用的。
Text & Data & Bss
.text
:也称为代码段(Code),用来存放程序执行代码,同时也可能会包含一些常量(如一些字符串常量等)。该段内存为静态分配,只读(某些架构可能允许修改)。
这块内存是共享的,当有多个相同进程(Process)存在时,共用同一个text段。
.data
: 也有的地方叫GVAR(global value),用来存放程序中已经初始化的非零全局变量。静态分配。
data又可分为读写(RW)区域和只读(RO)区域。
-> RO段保存常量所以也被称为.constdata
-> RW段则是普通非常全局变量,静态变量就在其中 .bss: 存放程序中为初始化的和零值全局变量。静态分配,在程序开始时通常会被清零。
从低地址到高地址
Reference
https://blog.csdn.net/qq_42762607/article/details/110391819
加油!
感谢!
努力!
以上是关于C/C++程序中全局变量局部变量堆栈的存储区域介绍的主要内容,如果未能解决你的问题,请参考以下文章