概述
为了更加灵活的确定申请空间的大小(空间较大),使用动态内存函数动态开辟内存空间。
一.动态内存函数
1.malloc
函数原型为voidmalloc(size_t size)
在堆区申请size个字节的空间,返回起始地址。size为0是未定义行为。
2.calloc
void calloc(size_t num,siz_t size)
同malloc功能一样,在堆区中申请num * size个字节的空间。唯一 区别是申请空间的同时将空间初始化为0.
3.realloc
函数原型为void* realloc(void* p,size_t size).
其中p为malloc或者calloc函数返回的起始地址。realloc用于在原来动态申请得到的空间的基础上扩充容量。若原来的空间之后没有足够的空间,则会重新申请size个字节的空间,然后将原来的内容拷贝到新申请的空间中,最后释放原来申请的空间。返回新申请空间的起始地址了。
4.free
函数原型为void free(void* p),用于释放动态申请的空间。
(1)若p指向的空间不是动态申请的,则是未定义行为。
(2)若p为NULL,则函数什么也不做。
二.常见的动态内存错误
1.动态申请内存之后要判空,否则若申请失败返回的是空指针。对空指针解引用是未定义行为。
2.对动态内存开辟空间的越界访问,同数组类似,下标的合法范围是0-size-1。
3.对非动态内存使用free释放(如释放局部变量的空间)
4.使用free释放动态内存的一部分(如申请空间返回的起始地址为0x100,大小为100个字节的空间,free(0x101))。
5.对同一块动态内存进行多次释放。
6.忘记释放动态内存(将导致内存泄露)
三.C/C++程序的内存分配
局部变量位于栈区,栈区的空间较小,申请速度极快。代码块结束则释放。
动态申请的内存位于堆区,堆区的空间非常大,申请速度较慢。程序结束时才释放。
静态变量、全局变量位于数据段。程序结束时才释放。
编译生成的二进制指令位于代码段。
最后
以上就是精明狗为你收集整理的动态内存管理的全部内容,希望文章能够帮你解决动态内存管理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复