小C的第一宇宙
wangc
Oct 10, 2017
阅读本文需要 2 分钟(按字数)

存储结构

  1. 变量的存储结构

https://raw.githubusercontent.com/wwg1996/wwg1996.github.io/master/images/cc1.png

属性
  • 生存期是执行过程的一个区间,从创建变量开始到销毁释放内存结束。
  • 作用域是可以在其中访问这个变量的代码区域。

  • 自动存储时间:从声明到代码块结束,重新执行代码块,重新生成,内存在栈空间进行分配。
  • 静态存储时间:从程序开始到程序结束。
  • 动态存储时间:利用动态内存分配,在空闲存储器上(堆)申请释放空间。

int pstr*( new char[20] );

new char[20]含义为申请一个内存为20个char类型数据的内存空间,并创建第一个元素的地址。然后将指针指向这个地址。

delete [] pstr;

delete对于基本变量先寻找地址,确定内存大小,在回收内存;对于对象,先寻找析构函数析构完成收回内存。注意new对应delete,new[]对应delete[]。

pstr = nullptr;

规范:指针重新初始化。

\n

分类
  • 按作用域
    • 全局变量:在函数外声明,作用域为声明到主函数结束。(尽量不使用,占内存)
    • 局部变量:代码块内声明,作用域为代码块。
      • 全局变量可以被同名的局部变量所隐藏。
  • 按存储方式
  • 自动变量:局部变量默认为自动变量,生存期为自动存储时间,需初始化。
  • 静态变量:变量声明前加static,全局变量默认为静态变量,生存期为静态存储时间,默认初始值为0。
  1. 数据内存区域

名称 存放
data area 数据区 全局变量,静态数据,常量
code area 代码区 存放代码
stack area 栈区 局部变量,返回数据,返回地址
heap area 堆区 动态内存分配
  1. lvalue和rvalue

  • ex1:a = b + c, lvalue = rvalue
  • ex2:a++ -> lvalue, ++a -> rvalue
  • lvalue:内存中持续存储数据的一个地址。
  • rvalue:临时存储的表达式结果。