![图片说明](https://uploadfiles.nowcoder.com/images/20200418/1298389_1587179865663_1379690E58939A4E3E24A537937D8660 "图片标题")

return局部指针造成的错误 https://blog.csdn.net/chengchaonan/article/details/79651683
static https://www.cnblogs.com/jhmu0613/p/7131997.html

C++中的内存分区

C/C++中内存分5大区:栈,堆,全局/静态存储区,常量存储区,代码区

栈(stack):指那些由编译器在需要的时候分配,不需要时⾃动清除的变量所在的存储区,效率高,分配的内存空间有限,形参和局部变量分配在栈区,栈是向地地址生长的数据结构,是一块连续的内存

堆(heap):由程序员控制内存的分配和释放的存储区,是向高地址生长的数据结构,是不连续的存储空间,堆的分配(malloc)和释放(free)有程序员控制,容易造成二次删除和内存泄漏

全局/静态区:全局、静态数据存放在一起的,初始化的全局变量和静态变量是在一起的。未初始化的全局变量和静态变量是在相邻的空间中。

说明:全局变量和静态全局变量的存储方式是一致的,但是其区别在于,全局变量在整个源代码中都可以使用,而静态全局变量只能在当前文件中有效。比如我们的一个程序有5个文件,那么某个文件中申请了静态全局变量,这个静态全局变量只能在当前文件中使用,其他四个文件均不可以使用。而某个文件中申请了全局变量,那么其他四个文件中都可以使用该全局变量(只需要通过关键字extern申明一下就可以使用了)。事实上static改变了变量的作用范围。

字符串常量区:存放字符串常量,程序结束后,由系统进行释放。比如我们定义char * p = “Hello World”; 这里的“Hello World”就是在字符串常量中,最终系统会自动释放。

代码区:存放程序体的二进制代码。比如我们写的函数,都是在代码区的。