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修饰的变量。
- 初始化是指在定义一个变量的时候是否给赋初值,有初值的就代表已初始化,没有的就代表未初始化。
了解了这几个概念后,继续介绍程序存储区的概念,明确不同的变量究竟存到了哪个位置。
看下面这个图:
程序一般有四个主要区域:代码段、数据段、堆区、栈区。
详细介绍下:
- 代码段:顾名思义,是存储代码指令的地方。这段区域是只读的,可以防止程序意外修改指令。
- 数据段:这块分为已初始化的数据区和未初始化的数据区。
- 初始化的数据区包含程序员初始化了的全局变量和静态变量。数据段不是只读的,因为程序运行过程中我们需要更改。进一步可分为初始化的只读区域和初始化的读写区域。比如const char* str = "hello world",字符串hello world就存储在初始化的只读区域,字符指针变量string就存储在初始化的读写区域。
- 未初始化的数据区包含未初始化的全局变量和静态变量。
平时使用new
和delete
操作的内存就是堆内存,它可以动态分配和释放,这块是由程序员手动操作的内存。
栈区域与堆区域相邻,而且向相反的方向增长。它存储局部变量和每次调用函数时保存的信息。在函数调用时,参数和返回值等都存在栈上。每次新调用一个函数时,栈空间都会增长,函数返回时,栈空间减少。我们常说的调用栈调用栈,就是这个函数的调用栈帧区。
总结
关于这方面的知识点也推荐大家看下这个资料:
暂时无法在飞书文档外展示此内容
练习
#include <iostream>
int global;
int global2 = 2;
int main() {
static int static_value = 100;
int *heap_value = new int[200];
int k = 299;
}
你知道上面代码里的这些变量都存储在哪些区域吗?
