前言:Hello大家好😘,我是心跳sy,接着上一节对 malloc 和 free 函数的介绍,今天为大家带来 realloc 函数和 calloc 函数的用法以及这几种函数的区别及联系,我们一起来看看吧!
🌈上一篇博文的链接在这里👉malloc与free函数的用法(精简全面 · 一看即懂)-优快云博客,友友们放心食用😘😘😘,下面开始今天的分享:
一、realloc函数 💫
1、⭐️realloc函数的头文件及参数介绍⭐️
👉realloc函数的头文件和 realloc、malloc、free函数一样,均在 stdlib.h 中,calloc 函数有两个参数,第一个参数是指向先前已使用 malloc、calloc或realloc 分配的内存块的指针,第二个参数是内存块的新大小,以字节为单位。 如果重新分配成功,该函数返回指向被分配内存的指针;否则返回空指针NULL
2、⭐️realloc函数的作用⭐️
👉realloc 函数的作用是重新分配内存块,更改由 ptr 指向的内存块的大小,值得一提的是,这个重新分配的空间可大可小(比之前的)。
👉该函数分配空间有两种类型:原地分配和异地分配
⭕️原地分配:如果新的内存块大于原来的内存块且原来的内存块后面还有足够多的剩余内存,那么函数将只调整原来的内存块的大小,并返回原内存块的地址。(在原基础上扩容)
⭕️异地分配:如果新的内存块大于原来的内存块,但原来的内存块后面没有足够多的剩余内存,那么函数将申请新的内存块并将原来的数据拷贝到新内存块中,原来的内存块将被释放,函数将返回新的内存块的地址(重新申请内存)
❓那么有的友友会问了,怎么判断这两个分配呢,在实际使用中,如果我们想知道,则看空间返回的地址即可,若地址不一致则采用了异地分配,反之原地分配。
3、⭐️realloc函数的使用⭐️
int*p=(int*)malloc(sizeof(int)*10);
int*p1=(int*)realloc(p,sizeof(int)*20);//申请更大的80字节的空间
👉申请过程:(这里是异地分配)
①、申请更大的80字节,将首地址返回,装进p1;
②、将原空间数据依次复制进新空间;
③、将原p指向的40字节空间释放,p1装着新空间,使用完之后free释放p1
⚠️注意:
🔴传递给 realloc 的指针必须是先前通过 malloc()、calloc()或realloc() 分配的
🔴传递给 realloc 的指针可以为NULL,这种情况下,realloc 函数的行为与 malloc 函数相同,将分配一个新的内存块
二、calloc函数 💫
1、⭐️calloc函数的头文件及参数介绍⭐️
👉calloc函数的头文件和 realloc、malloc、free函数一样,均在 stdlib.h 中,calloc 函数有两个参数,第一个参数意为要分配的元素数量,第二个参数意为每个元素的大小,返回值仍然是指针类型。
2、⭐️calloc函数的作用⭐️
👉calloc 函数与 malloc 函数的作用大致一致,均为动态分配内存块,不同的是,malloc 函数不会初始化内存块,而 calloc 函数分配并零初始化数组,为元素中的每一个分配一块大小为 size 字节的内存块,并将其所有位初始化为零,其实际结果是分配一个零初始化的内存块(共num*size)字节。
3、 ⭐️calloc函数的使用⭐️
👉我们平时日常编码时,若不强调需要初始化,则使用 malloc 和 calloc 哪一个都可以,使用时写法有稍许区别:
int* p=(int*)malloc(sizeof(int)*10);
int* p1=(int*)calloc(10,sizeof(int));//乘积是总字节数
free(p);
free(p1);
上述开辟字节均为10*4=40个,注意使用 calloc 函数要将参数拆开使用,中间用逗号分离。
三、malloc、realloc、calloc函数的区别总结 💫
🔴malloc 只负责分配指定字节数的内存块,不对其进行初始化。
🔴calloc 在分配内存块的同时,将其初始化为零。
🔴realloc 用于重新分配内存块的大小,并尝试保留原始内存块中的数据。
👉感谢大家花费宝贵的时间阅读本文章,制作不易,希望大家多多支持呀😘😘😘,如有任何问题欢迎各位大佬在评论区批评指正!!!