经过上一节的学习我们对C语言的指针有了一定的认识,接下来让我们来学习一下动态内存分配的知识吧!
正文
当你写这样的一行代码的时候就会发生stack overflow栈溢出,这样我发现来看一下 C语言内存
1、栈区 2、堆区 3、全局区或静态区 4、字符常量区 5、程序代码区
对于栈区,栈内存分配了2M,当你设置的超出了2M就会发生栈溢出
对于堆区,在这里需要程序员自己去手动释放掉,堆区占系统的80%
接下来我们了解一下内存的分配:
- 静态内存分配:分配的内存大小是固定,这样会很容易超出栈内存的最大值,为了防止内存不够用会开更多的内存造成了浪费
- 动态内存分配:在程序运行过程中,动态指的使用内存的大小,在不用的时候还可以手动的进行释放。
不断的去调用这两个方法就会发现开辟栈内存的方法执行完就会自动释放,而堆内存则不会。
更多的情况是当原来开辟的空间不足的时候进行扩容,这里也分为两种情况,扩大和缩小
缩小:缩小的情况只是将那一部分的数据丢失。
扩大:
- 如果当前内存段后面有需要的内存空间,那就直接扩展这段内存空间,那么realloc返回的是原先的地址。
- 如果当前内存段后面的内存空间不足时,那么久使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置并将原先的内存释放掉并返回新的内存地址。
- 如果申请失败,返回NULL,原来的指针仍然有效。
这里我们需要注意几点
- 不能多次进行释放操作
- 释放完之后,我们需要给指针置为NULL,标志着释放完成
- 内存泄漏,重新复制之后,在free并没有真正得释放内存