C++ 变量的存储位置、作用域和生存周期

1. C语言中内存的分布:

C语言在内存中一共分为如下几个区域,分别是:

  1. 栈区(stack): 由编译器自动分配、释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
  2. 堆区(heap) : 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。
  3. 全局区(静态区):存储全局变量和静态变量,初始化的全局变量和静态变量在一块区域(RW), 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(ZI)。 - 程序结束后有系统释放
  4. 文字常量区 :常量字符串就是放在这里的。 程序结束后由系统释放 (RO)
  5. 程序代码区—存放函数体的二进制代码。 (RO)

在这里插入图片描述

  • text( 程序代码区和文字常量区): 用来存放程序执行代码,同时也会包含一些常量(如一些字符串常量等)。静态分配
    该段内存为静态分配,只读(某些架构可能允许修改)。
    这块内存是共享的,当有多个相同进程(Process)存在时,共用同一个text段。

  • GVAR(global value),用来存放程序中已经初始化的非零全局变量和静态变量静态分配
    可分为读写(RW)区域和只读(RO)区域。
    -> RO段保存const常量所以也被称为.constdata
    -> RW段则是普通非常全局变量,静态变量就在其中

  • .bss: 存放程序中为未始化的和零值全局变量,和静态变量。静态分配内存。

  • 堆(Heap)往高地址方向生长,栈(Stack)往低地址方向生长。

在这里插入图片描述

在这里插入图片描述

2. 全局变量和静态变量的区别:

2.1 静态全局变量

#include<iostream>
using namespace std;
static int i = 5;
int j = 3;//默认为extern
int main()
{
    /*code*/
}
  • 全局变量 j 和静态全局变量 i 都存放于程序的全局数据区域,
  • 它们的生存周期都是程序的整个运行期,
  • 但是 j 的作用域为全局作用域,可以通过extern在其他文件中使用,而 i 的作用域为文件作用域,只能在文件A中使用,

例如在文件B中:

extern int j; //OK
extern int i; // error: i在文件B中不可见
int a = j; // OK
int b = i; // error

2.2 局部静态变量

#include<iostream>
using namespace std;
void fun()
{
    int i = 1; // 局部变量,具有动态生存期,每次进入函数时都初始化
    static int j = 2; //静态局部变量,具有全局寿命,局部可见,只第一次进入函数时被初始化
}
int main()
{
    static int j; //静态局部变量,具有全局寿命,局部可见
}

静态局部变量有以下特点:

  • 该变量在全局数据区分配内存;
  • 静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化
  • 它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值