C语言少不了的malloc(),realloc(),calloc(),free(),通俗讲解

malloc()

  • 用途
    malloc()函数经常用于申请动态内存空间,打个比方,内存就是一个大面包,你想要切多少,你就申请多少,当然最小是一个字节,你可以一下子很大的空间,用来作为数组,也可以每次申请一定大小的空间,然后用指针把他们连起来,做成链表。很好理解
  • 用法
    函数原型:void malloc(unsigned int num_bytes);
    参数:num_bytes是无符号整型,用于表示分配的字节数。
    返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。
    void
    表示未确定类型的指针,void *可以指向任何类型的数据,
    更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int或者…)
    功能:分配长度为num_bytes字节的内存块
    注意:当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。

    看不懂就看看例子就懂了
#include"stdio.h"

#include"malloc.h"//malloc()函数被包含在malloc.h里面

int main(void)
{

char*a=NULL;//声明一个指向a的char*类型的指针
     
a=(char*)malloc(100*sizeof(char));//使用malloc分配内存的首地址,然后赋值给a,注意已经强制类型转换了
   //100*sizeof(char)这句经常用到,计算分配的多少单位,但你又不知道一个元素占多少字节
if(!a)//如果malloc失败,可以得到一些log
         
{
return-1;
}

sprintf(a,"%s","HelloWorld\n");//"HelloWorld\n"写入a指向的地址
     
printf("%s\n",a);//输出用户输入的数据
     
free(a);//释放掉使用的内存地址

return0;
  
}

(分配类型 *)malloc(分配元素个数 *sizeof(分配类型))
如果成功,则返回该空间首地址,该空间没有初始化,如果失败,则返回0

calloc()

  • 这个和上一个第一个区别就是,括号里的东西,这个函数分配的时候,就不是说你要多少字节我按字节划给你,而是你告诉我,你的一个元素占有多少字节,你要多少个元素(小声BB:还不是一样)。看看这货长的样子void *calloc(元素个数,一个元素的大小);用的时候元素大小不知道?好说 sizeof
  • 第二个区别就是这货申请的内存空间里面会自动置为‘’零‘’,零我可是加了引号哦!就是说
    如果你是为字符类型或整数类型的元素分配内存,那麽这些元素将保证会被初始 化为0;如果你是为指针类型的元素分配内存,那麽这些元素通常会被初始化为空指针;如果你为实型数据分配内存,则这些元素会被初始化为浮点型的零。*
    其他用法就和malloc 一致就不多bb了
    ------------------------------分割一下----------------------------------------------------------------------------------------------

realloc()

  • 说一下啊,这货是经常用来给上面分配好的空间再加上一段内存空间。

原型:extern void *realloc(void mem_address, unsigned int newsize);
语法:指针名=(数据类型
)realloc(要改变内存大小的指针名,新的大小)。//新的大小一定要大于原来的大小,不然的话会导致数据丢失!
头文件:#include <stdlib.h> 有些编译器需要#include <malloc.h>
功能:先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回,如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域(注意:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。
返回值:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。注意:这里原始内存中的数据还是保持不变的。当内存不再使用时,应使用free()函数将内存块释放。

free()

free(指针)用来声明一个指针所指向的空间为可用状态。具体解释为:操作系统采用红黑树管理内存,当一段内存被分配,就从红黑树中“剪掉”,表示这段内存空间已被占用,当使用free之后,就是声明这段内存可以再次放到红黑树上供操作系统分给进程使用。当然,一般来说,开头指针要指向空NULL,不然虽然还是可以访问到那个位置,但没什么用。 所以啊所以,动态分配用过之后一定要free,不然还要关机重启才能把那段内存给拿回来。养成好习惯

发布了37 篇原创文章 · 获赞 1 · 访问量 645

猜你喜欢

转载自blog.csdn.net/zzuzhaohp/article/details/103674374