目录
摘要:
一:C++的内存区域划分图
二:各个区域存储的数据
三:题目
四:总结和补充
摘要:
本文介绍C++的内存区域划分,以及代码中遇见的变量存储在内存中的何处,最后总结要点
一:C++的内存区域划分图
解释:C++的内存区域可以分为,内核空间,栈,内存映射段,堆,数据段(静态区),代码段(常量区),一般存储用的是栈,堆,数据段(静态区),代码段(常量区),本文也只讲解这些~
二:各个区域存储的数据
1:栈区
该区域存储:临时变量
函数(各种函数或者main函数)创建的临时变量会存储在函数调用产生的栈帧中,而栈帧就存储在栈区,所以临时变量存储在栈区(函数结束 变量销毁 栈帧销毁 空间还给操作系统)
2:堆区
该区域存储:各种动态开辟的空间
如:各种数据结构(链表,顺序表等等)中malloc或new动态开辟的空间;某些算法也需要动态malloc或new开辟一个临时的数组,如归并排序
堆区存储的数据特点是:需要手动释放如free
3:数据段(静态区)
该区域存储:全局变量和静态变量
①:全局变量(定义在全局区域的变量)
②:静态变量(static修饰的变量,包括全局静态变量还是局部静态变量)
4:代码段(常量区)
该区域存储:常量 只读的数据 可执行代码
①:常量即字面量,也就是我们键盘上打出来的内容 如 10 1.2 'x' "abcd"
②:只读的数据,const在全局修饰的变量 如 全局的const int a = 10
③:程序的指令部分,包括函数的实现代码(了解即可)
三:题目
int globalVar = 1; static int staticGlobalVar = 1; void Test() { static int staticVar = 1; int localVar = 1; int num1[10] = { 1, 2, 3, 4 }; char char2[] = "abcd"; const char* pChar3 = "abcd"; int* ptr1 = (int*)malloc(sizeof(int) * 4); int* ptr2 = (int*)calloc(4, sizeof(int)); int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4); free(ptr1); free(ptr3); } 1. 选择题: 选项: A.栈 B.堆 C.数据段 D.代码段 ①:globalVar在哪里?__C__ ②:staticGlobalVar在哪里?__C__ ③:staticVar在哪里?__C__ ④:localVar在哪里?__A__ ⑤:num1 在哪里?__A__ ⑥:char2在哪里?__A__ ⑦:*char2在哪里?_A__ ⑧:pChar3在哪里?__A__ ⑨:*pChar3在哪里?__D__ ⑩:ptr1在哪里?_A__ 11:*ptr1在哪里?__B__解释:
①: globalVar在哪里?
globalVar是一个全局变量 所以在数据段中
②:staticGlobalVar在哪里?
staticGlobalVar是一个全局静态变量,静态变量不管是全局还是局部都是在数据段中
③:staticVar在哪里?
staticVar是一个局部静态变量,静态变量不管是全局还是局部都是在数据段中
④:localVar在哪里?
localVar 在栈区,因为其是一个函数运行时候产生的临时变量
⑤:num1 在哪里?
num1在栈区中,因为整个数组都是函数运行时候产生的临时变量,num1作为数组名为首元素地址,实际上是个指针,其也是存储在栈上的临时变量
⑥:char2在哪里?
char char2[ ] = "abcd"; 这句代码会在栈区创建一个数组,该数组里面的内容就是abcd ,然后char2作为数组名,是首元素的地址,也是放在栈区的,因为不论是数组还是数组名都是函数内产生的临时变量,如图(和⑤同理):
注意:这句代码中的"abcd"这个字符串是存储在代码段(常量区)的,只是这句代码前面的[ ]这种方括号的定义数组的方式,会在栈区根据代码段(常量区)的"abcd"的内容和大小创建一个同样的数组
⑦:*char2在哪里?
如⑥中的图,数组和数组名都是函数产生的临时变量,所以也是*char也就是数组,是在栈区的
⑧:pChar3在哪里?
const char* pChar3 = "abcd";正如⑥中的注意所言,"abcd"是在代码段(常量区)的,这里没有像⑥一样,通过[ ]方括号的形式来创建一个数组,而是pChar3作为一个指针,直接指向的常量区的"abcd"的首地址,而pChar3作为函数的临时变量,其是在栈区的,如图:
在这里const的作用是:维持权限的一致
因为不加const会报错 因为代码段(常量区)的"abcd"是不可以修改的 即使给了你首地址,也要加上const,防止代码段(常量区)"abcd"被修改
⑨:*pChar3在哪里?
如⑧所言,因为*pChar3是"abcd",所以其是在代码段(常量区)
⑩:ptr1在哪里?
虽然ptr1指向的空间是动态开辟的,在堆区,但是ptr1并不在堆区,其只是一个在栈区的临时变量,其指向了堆区的空间
11:*ptr1在哪里?
如⑩所言,*ptr1代表的是动态开辟的空间,所以是在堆区
四:总结和补充
1:动态开辟的空间是在堆区的,但是指向这个空间的指针变量是在栈区的
2:char char2[] = "abcd";这个生成的数组是按照在代码段(常量区)的"abcd"的大小和内容生成的,这个数组是在栈区的
3:全局变量和全局静态变量(static)的区别:
①:后者只能初始化一次
②:前者在当前程序的所有文件中都可以用,但是后者只有在当前文件才能进行使用
而函数内的静态变量(static),也就是局部静态变量还有一个限制,就是只能在当前函数可用
但是三者的生命周期一样,都是整个程序结束才会结束
📌 [ 作者 ] shylyly
📃 [ 首次发布 ] 2025.2.21
❌ [ 最新修改 ] 2026.10.1
📜 [ 声明 ] 由于笔者水平有限,文中难免有疏漏或不妥之处,还望读者不吝赐教