前言
在使用C语言编写程序时,使用动态内存是不可避免的,因此了解动态内存管理函数也是必要的。
本文讲了关于动态内存管理的四个函数的使用和注意事项。
一、内存划分
以下为C程序运行时,内存的划分图:
二、malloc函数
该函数为C语言的动态内存开辟函数
代码语言:javascript复制void* malloc(size_t size);
注意事项:
- 开辟成功,返回一个指针,指向开辟好的空间;
- 开辟失败,返回NULL;
- 返回类型为void*,使用时需要用户根据需要修改数据类型;
- 若size为0,malloc的行为是未定义的,由编译器自己决定。
三、calloc函数
该函数为C语言的动态内存分配函数
代码语言:javascript复制void* calloc(size_t num, size_t size);
num:元素个数;
size:字节大小。
注意事项:
- 开辟成功,返回一个指针,指向开辟好的空间;
- 开辟失败,返回NULL;
- 返回类型为void*,使用时需要用户根据需要修改数据类型;
- 若size为0,calloc的行为是未定义的,由编译器自己决定。
注:
malloc申请到的空间,没有初始化,直接返回起始地址;
calloc申请好空间后,会把空间初始化为0,然后返回起始地址。
四、realloc函数
该函数为C语言的对动态开辟内存大小的调整的函数
代码语言:javascript复制void* realloc(void* ptr, size_t size);
注意事项:
- 指针ptr指向的内存空间后,有足够的空间可以扩容,直接在后边续上新的空间,返回旧的起始地址;
- 当后边没有足够的空间扩容时,realloc会找一个满足空间大小的新的连续的空间。把旧的空间的数据,拷贝新空间的前面的位置,并且把旧的空间释放掉,返回新的空间的地址。
- realloc扩容失败时,返回NULL。
五、free函数
专门做动态内存的释放和回收
代码语言:javascript复制void free(void* ptr);
注意:
ptr是指向一片连续的堆区的内存空间。
总结
在使用完calloc|malloc|realloc函数之后,一定一定要记得使用free函数释放空间哦~
上述函数说明就是整个动态内存管理函数的全部啦,如果你有兴趣想要深入了解,可以通过写一个动态的通讯录理解它们C_Ccpp/C_study/contact at main · Yjun6/C_Ccpp (github.com)。