C语言中定义了4个内存区间:代码区/全局变量与静态变量区/局部变量区即栈区/动态存储区,即堆区。
代码区:
程序被操作系统加载到内存的时候,所有的可执行代码(程序代码指令、常量字符串等)都加载到代码区,这块内存在程序运行期间是不变的。代码区是平行的,里面装的就是一堆指令,在程序运行期间是不能改变的。函数也是代码的一部分,故函数都被放在代码区,包括main函数。
静态区
静态区存放程序中所有的全局变量和静态变量。
栈区
栈(stack)是一种先进后出的内存结构,所有的自动变量、函数形参都存储在栈中,这个动作由编译器自动完成,我们写程序时不需要考虑。栈区在程序运行期间是可以随时修改的。当一个自动变量超出其作用域时,自动从栈中弹出。
每个线程都有自己专属的栈;
栈的最大尺寸固定,超出则引起栈溢出;
变量离开作用域后栈上的内存会自动释放。
局部变量在栈区,函数执行结束时这些存储单元被自动释放。栈的容量是有限的(8192K)。
堆(heap)和栈一样,也是一种在程序运行过程中可以随时修改的内存区域,但没有栈那样先进后出的顺序。更重要的是堆是一个大容器,它的容量要远远大于栈,这可以解决内存溢出困难。一般比较复杂的数据类型都是放在堆中。但是在C语言中,堆内存空间的申请和释放需要手动通过代码来完成。
堆区即动态存储区:所有动态存储分配调用void *malloc(int num);
在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。
void free(void *address);
该函数释放 address 所指向的内存块,释放的是动态分配的内存空间。
需要注意的是:malloc函数是定义的void*指针函数,调用之前需要进行类型强制转换,free使用后,要将指针置为NULL,不可重复free同一个指针内存。
在指针使用过程中会无意间使用成了野指针,我们应尽量避免进坑,可以参考以下链接:https://blog.csdn.net/XD_hebuters/article/details/78469748了解野指针,远离野指针。