当前位置: 首页 > Linux

linux-C基础系列-内存管理(动态内存分配).md

时间:2023-04-06 11:11:51 Linux

动态内存分配概述C语言的所有操作都是基于内存的。变量和数组是内存的别名。如何分配此内存由编译器在变异期间确定。比如在定义数组的时候必须指定数组的长度,所以数组的长度必须在编译的时候就确定下来。但有时程序在运行时,可能需要使用一些额外的内存空间。malloc和freemalloc分配的内存是一块连续的内存,以字节为单位,没有任何类型信息。free用于将动态内存返回给系统。其原型如下:void*malloc(size_tsize);voidfree(void*p);注意:malloc实际分配的内存可能比申请的略多,但不能以此为准;当请求的动态内存不能满足时malloc返回NULL;当free的参数为NULL时,函数直接返回。所以无论如何在使用malloc时必须检查返回值是否可用。calloc和realloccalloc类似于realloc,可以用于内存申请。原型如下:void*calloc(size_tnum,size_tsize);参数:num申请的内存个数size每个内存块的大小*NULL申请失败,非NULL申请成功,其总空间为num*size。void*realloc(void*p,size_tnew_size);参数:p原内存空间new_size所需的新内存空间返回值:NULL申请失败,非NULL申请成功。从上面可以看出,calloc和realloc都可以返回请求的内存信息,这和malloc是一样的,使用前需要检查返回值是否可用。与malloc不同的是,calloc返回的内存会被初始化为0,而realloc是用来修改原来分配的内存大小的,所以使用realloc的返回值为新分配的内存空间,当第一个参数为NULL时,则realloc等同于malloc。示例如下:#include#include#include#include#include#includeintmain(void){inti;int*pi=(int*)malloc(5*sizeof(int));短*ps=(短*)calloc(5,sizeof(短));断言(pi&&ps);for(i=0;i<5;i++){printf("pi[%d]=%d,ps[%d]=%d\n",i,pi[i],i,ps[i]);}pi=(int*)realloc(pi,10*sizeof(int));如果(NULL==pi){免费(pi);免费(ps);perror("重新分配\n");退出(退出失败);(i=0;i<10;i++){printf("pi[%d]=%d\n",i,pi[i]);}免费(圆周率);免费(ps);return0;}从上面可以看出,动态内存分配是C语言中一个强大的功能,只要能在需要的时候动态申请内存即可。总结:malloc只是简单的向系统申请一个固定字节的内存;calloc可以申请某种类型或指定单元大小的内存,并初始化为0;realloc用于重置内存大小。那么问题来了,malloc(0)的返回值是多少?一般来说,如果malloc的返回值为NULL,malloc就会失败,否则会返回一个有效的内存地址,可以释放,这个有效内存地址的有效内存空间为0,因为空间为0的内存空间也是内存对象,其含义与NULL不同。calloc(0,0)的返回值是多少?与malloc相同。realloc(p,0)怎么样?和免费一样。邮箱:MingruiZhou@outlook.com