在学习相关内容之前我们先来做一道题目分析globalvar是一个全局变量所以globalvar在静态区static GlobalVar被static修饰说明它是一个静态变量那就在静态区static Var在静态区localVar是一个局部变量局部变量的空间都是在桟帧中开辟的所以在栈上num1单独出现表示数组首元素的地址那它就是一个指针变量在栈上char2表示数组名为首元素地址字符串存储在数组中这个字符串是可以被修改的那么这个字符串就是在栈上那char2就在栈上*char2表示首元素也在栈上pchar3是一个指针变量在栈上const char* pchar3abcd中的const修饰的是指针指向的内容这个内容不能被修改这个字符串为常量字符串在常量区*pchar3就在常量区ptr1中存放的是申请空间的地址是一个指针变量在栈上*ptr1表示申请空间的首元素空间是在堆上申请的所以*ptr1在堆上。选择题答案globalVar在哪里______C. 数据段静态区全局变量存储在静态区数据段staticGlobalVar在哪里______C. 数据段静态区static修饰的全局变量也存储在静态区staticVar在哪里______C. 数据段静态区函数内的static局部变量也存储在静态区localVar在哪里______A. 栈普通局部变量在栈上num1 在哪里______A. 栈数组名代表数组首地址但数组本身在栈上char2在哪里______A. 栈局部字符数组整个数组在栈上*char2在哪里______A. 栈数组首元素在栈上pChar3在哪里______A. 栈指针变量本身在栈上*pChar3在哪里______D. 代码段常量区指向的字符串abcd是常量字符串在常量区ptr1在哪里______A. 栈指针变量本身在栈上*ptr1在哪里______B. 堆malloc分配的内存空间在堆上图示解释正文一、C语言中的内存管理回顾前面在C语言中的学习我们学习过malloc/calloc/realloc/free我们通过题目来回顾一下【面试题】1. malloc/calloc/realloc的区别malloc申请空间时不进行初始化calloc申请空间时自动初始化为0realloc是对空间的增容如果原空间后面有空间那直接在其后面直接扩容新空间的地址和原空间的地址一样如果原空间的后面空间不够则新找一块空间并将原空间中的数据拷贝到新空间中再将原空间释放然后返回新空间的地址2. malloc的实现原理 glibc中malloc实现原理其实C语言中的内存管理已经可以解决很多问题那为什么C中要搞个新的内存管理呢ok通过下面的学习我们就知道原因了二、C内存管理2.1 初识new和deleteC语言内存管理方式在C中可以继续使用但有些地方就无能为力而且使用起来比较麻烦因此C又提出了自己的内存管理方式——通过new和delete操作符进行动态内存管理。2.2 new和delete2.2.1 new的使用那这时候就有人想问了如果我们想要初始化该怎么做2.2.2 delete的使用delete的使用分为两种情况 情况1释放单个代码语言javascriptAI代码解释//申请一个int类型的空间并初始化 int* p3 new int(10); //释放单个 delete p3;情况2释放多个代码语言javascriptAI代码解释//申请一个空间大小为10的数组int类型并部分初始化 int* p4 new int[10] {1, 2, 3, 4}; //释放多个 delete[] p4;提醒释放多个也可以直接写delete p4; 但是不建议这么写这里博主有一个问题我们看啊在C中有申请空间还有扩容刚才我们学习C中的申请空间那C中有扩容吗其实是没有的如果需要扩容自己手动扩我们看到其实new和delete的功能和malloc、calloc、free的功能很接近那为什么祖师爷还要搞new和dlete呢其实是为了自定义类型用malloc可以申请一个自定义类型的空间那该怎么初始化呢这是不是一个问题那为了解决这个问题祖师爷就搞出了new和delete.