ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

C++的内存分布及其存储的数据

C++的内存分布及其存储的数据 目录摘要一C的内存区域划分图二各个区域存储的数据三题目四总结和补充摘要本文介绍C的内存区域划分以及代码中遇见的变量存储在内存中的何处最后总结要点一C的内存区域划分图解释C的内存区域可以分为内核空间栈内存映射段堆数据段(静态区)代码段(常量区)一般存储用的是栈堆数据段(静态区)代码段(常量区)本文也只讲解这些~二各个区域存储的数据1栈区该区域存储临时变量函数(各种函数或者main函数)创建的临时变量会存储在函数调用产生的栈帧中而栈帧就存储在栈区所以临时变量存储在栈区函数结束 变量销毁 栈帧销毁 空间还给操作系统2堆区该区域存储各种动态开辟的空间如各种数据结构(链表,顺序表等等)中malloc或new动态开辟的空间某些算法也需要动态malloc或new开辟一个临时的数组如归并排序堆区存储的数据特点是需要手动释放如free3数据段静态区该区域存储全局变量和静态变量①全局变量定义在全局区域的变量②静态变量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动态开辟的空间是在堆区的但是指向这个空间的指针变量是在栈区的2char char2[] abcd;这个生成的数组是按照在代码段常量区的abcd的大小和内容生成的这个数组是在栈区的3全局变量和全局静态变量static的区别①后者只能初始化一次②前者在当前程序的所有文件中都可以用但是后者只有在当前文件才能进行使用而函数内的静态变量static也就是局部静态变量还有一个限制就是只能在当前函数可用但是三者的生命周期一样都是整个程序结束才会结束 [ 作者 ] shylyly [ 首次发布 ] 2025.2.21❌ [ 最新修改 ] 2026.10.1 [ 声明 ] 由于笔者水平有限文中难免有疏漏或不妥之处还望读者不吝赐教
返回列表