动态内存分配复习

动态内存分配复习

为什么要使用动态内存分配:

在声明数组时,必须用一个编译常量指定数组长度,但是,数组的长度往往只有在运行的时候才能被确定,这是因为它所需要的内存空间取决于输入数据,但是容易浪费空间,又或者容易溢出

malloc和free:

malloc执行动态内存分配,free执行释放内存,当使用malloc函数时,malloc从内存池中提取一块合适的内存,并向程序返回一个指向该内存的指针,但此时这块内存并没有进行初始化,如果想要对内存进行初始化,可以考虑使用calloc函数,当调用free函数时,会把提取的内存放回内存池中

void *malloc(size_t size);
void  free(void*pointer);

以上两个为malloc和free的函数原型

malloc所分配的是一块连续的内存,而且其分配的内存实际上会比请求的多

如果系统内存不足或者无法满足malloc的内存需求,则会返回NULL,因此使用malloc函数需要检查是否成功

free的参数必须是NULL,或者是malloc、realloc、calloc函数的返回值

calloc和realloc

void *calloc(size_t num_elements,size_t element_size);
void  realloc(void* ptr,size_t  new_size);

calloc函数与malloc函数类似,但有两点区别,首先,calloc函数会在返回指向内存的指针的时候,将其初始化,但是这个初始化过程需要花费一定的时间,第二点是calloc函数的参数不同,calloc函数参数是所需元素数量以及元素大小

realloc:再次分配内存大小,它可以扩大或者缩小malloc所取得的内存空间,但是如果是扩大的时候,增大的部分不会进行初始化,缩小的化,仅将尾部部分去掉,剩余内容不变,如果原先内存空间大小不可改变,那么realloc函数就会新开辟一个内存空间,然后将原内存空间内容复制进来,所以调用realloc函数时,要创建一个新的指针来接受realloc函数的返回值,最后如果realloc的第一个参数是NULL,那么其作用和工作流程和malloc函数一样

使用动态分配的内存

int *pi;
pi=malloc(100);//分配了100字节,并返回了指向有100字节的内存空间的指针
pi=malloc(25*sizeof(int));//因为pi为整数类型,所以实质为有25个整数的整数数组
int* pi2=pi;
for(int i=0;i<25;i++)
    pi2++=0;
for(int i=0;i<25;i++)
    pi[i]=0;

 

posted @ 2023-05-24 20:18  alexlance  阅读(11)  评论(0编辑  收藏  举报