09、变量和存储区介绍

厨子大约 3 分钟C语言基础程序程序厨

主要介绍下C++中变量和存储区的概念。其实这里也不单单适用于C++,Linux程序的布局应该都是这样的。

正文

首先需要清楚几个概念:

  • 全局变量
  • 局部变量
  • 静态变量
  • 初始化

这应该是大多数编程语言通用的概念。

看这段代码:

#include <iostream>

int global;   // 全局变量,未初始化
int global2 = 2; // 全局变量,初始化

int main() {
  static int static_value = 100; // 静态变量,初始化
  int k = 299;         // 局部变量,初始化
  int kk;            // 局部变量,未初始化
  kk = 100;           // 局部变量,赋值
}
  • 全局变量就是指作用域是全部范围的变量。
  • 局部变量就是指作用域是局部范围的变量。
  • 静态变量就是指使用static修饰的变量。
  • 初始化是指在定义一个变量的时候是否给赋初值,有初值的就代表已初始化,没有的就代表未初始化

了解了这几个概念后,继续介绍程序存储区的概念,明确不同的变量究竟存到了哪个位置。

看下面这个图:

img
img

程序一般有四个主要区域:代码段、数据段、堆区、栈区。

详细介绍下:

  • 代码段:顾名思义,是存储代码指令的地方。这段区域是只读的,可以防止程序意外修改指令。
  • 数据段:这块分为已初始化的数据区和未初始化的数据区。
  • 初始化的数据区包含程序员初始化了的全局变量和静态变量。数据段不是只读的,因为程序运行过程中我们需要更改。进一步可分为初始化的只读区域和初始化的读写区域。比如const char* str = "hello world",字符串hello world就存储在初始化的只读区域,字符指针变量string就存储在初始化的读写区域。
  • 未初始化的数据区包含未初始化的全局变量和静态变量。

平时使用newdelete操作的内存就是堆内存,它可以动态分配和释放,这块是由程序员手动操作的内存。

栈区域与堆区域相邻,而且向相反的方向增长。它存储局部变量和每次调用函数时保存的信息。在函数调用时,参数和返回值等都存在栈上。每次新调用一个函数时,栈空间都会增长,函数返回时,栈空间减少。我们常说的调用栈调用栈,就是这个函数的调用栈帧区。

总结

关于这方面的知识点也推荐大家看下这个资料:

暂时无法在飞书文档外展示此内容

练习

#include <iostream>

int global;
int global2 = 2;

int main() {
  static int static_value = 100;
  int *heap_value = new int[200];
  int k = 299;
}

你知道上面代码里的这些变量都存储在哪些区域吗?