C语言/动态内存管理函数

2023-10-16 08:30:12 浏览数 (1)

前言

在使用C语言编写程序时,使用动态内存是不可避免的,因此了解动态内存管理函数也是必要的。

本文讲了关于动态内存管理的四个函数的使用和注意事项。

一、内存划分

以下为C程序运行时,内存的划分图:

二、malloc函数

该函数为C语言的动态内存开辟函数

代码语言:javascript复制
void* malloc(size_t size);

注意事项:

  1. 开辟成功,返回一个指针,指向开辟好的空间;
  2. 开辟失败,返回NULL;
  3. 返回类型为void*,使用时需要用户根据需要修改数据类型;
  4. 若size为0,malloc的行为是未定义的,由编译器自己决定

三、calloc函数

该函数为C语言的动态内存分配函数

代码语言:javascript复制
void* calloc(size_t num, size_t size);

num:元素个数;

size:字节大小。

注意事项:

  1. 开辟成功,返回一个指针,指向开辟好的空间;
  2. 开辟失败,返回NULL;
  3. 返回类型为void*,使用时需要用户根据需要修改数据类型;
  4. 若size为0,calloc的行为是未定义的,由编译器自己决定。

注:

malloc申请到的空间,没有初始化,直接返回起始地址;

calloc申请好空间后,会把空间初始化为0,然后返回起始地址。

四、realloc函数

该函数为C语言的对动态开辟内存大小的调整的函数

代码语言:javascript复制
void* realloc(void* ptr, size_t size);

注意事项:

  1. 指针ptr指向的内存空间后,有足够的空间可以扩容,直接在后边续上新的空间,返回旧的起始地址
  2. 当后边没有足够的空间扩容时,realloc会找一个满足空间大小连续的空间。把旧的空间的数据拷贝新空间的前面的位置,并且把旧的空间释放掉返回新的空间的地址
  3. 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)。

0 人点赞