深入浅出C语言内存管理用法

14 篇文章 0 订阅
2 篇文章 0 订阅

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了解野指针,远离野指针。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值