动态内存分配复习
为什么要使用动态内存分配:
在声明数组时,必须用一个编译常量指定数组长度,但是,数组的长度往往只有在运行的时候才能被确定,这是因为它所需要的内存空间取决于输入数据,但是容易浪费空间,又或者容易溢出
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;
标签:malloc,函数,realloc,内存,动态内存,calloc,size,分配,复习 From: https://www.cnblogs.com/alexlance/p/17429406.html