动态内存管理存放在内存中的堆区中
动态内存分配的函数:malloc、calloc、realloc、free
动态内存分配
- malloc函数(内存申请空间)无初始化
- free函数(动态内存释放)
- calloc函数(内存空间申请)初始化
- realloc函数(调整空间)
malloc函数(内存申请空间)无初始化
分配一个大小字节的内存块,返回一个指向该块开头的指针。
新分配的内存块的内容没有初始化,保留不确定的值。
如果size为0,则返回值取决于特定的库实现(它可能是也可能不是空指针),但是返回的指针不能被解引用。
malloc:是用来申请内存空间的
free函数(动态内存释放)
free:可以释放申请的内存
主动释放动态开辟的内存空间
注意free不能将接收的指针赋值为NULL,需要主动赋值为NULL
代码:
#include<stdio.h>
#include<errno.h>
#include<string.h>
#include<stdlib.h>//malloc头文件
int main()
{int* p =(int*)malloc(40);//申请40个字节来存放10个整形//因为malloc返回为void*,需要强制类型转换为int*if(p==NULL){printf("%s", strerror(errno));return 1;}//40个字节存放1-10for (int i = 0; i < 10;i++){*(p + i) = i + 1;//p是起始位置地址,为整形,访问数组下标为i的元素,跳过int类型i的字节个数//i+1赋值}//打印for (int i = 0; i < 10;i++){printf("%d ", *(p + i));}free(p);p = NULL;
}
开辟空间失败
int* p =(int*)malloc(INT_FAST64_MAX);if(p==NULL){printf("%s", strerror(errno));return 1;}
calloc函数(内存空间申请)初始化
malloc不存放元素打印出随机值,malloc申请到的空间没有初始化,直接返回的起始地址,效率高
而calloc申请好空间后,会把空间初始化为0,返回起始地址
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{int* p=(int*)calloc(10,sizeof(int));//参数为元素个数和类型占用几个字节if(p==NULL){perror("calloc");return 1;}//使用for (int i = 0; i < 10;i++){printf("%d ", *(p + i));}free(p);p = NULL;return 0;
realloc函数(调整空间)
如果第一个参数传入的一个NULL指针的话,功能相当于malloc功能
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{//内存空间开辟int* p = (int*)malloc(5 * sizeof(int));if(p==NULL){perror("malloc");return 1;}//使用for (int i = 0; i < 5;i++){*(p + i) = 1;}//调整int* ptr = (int*)realloc(p, 10 * sizeof(int));//可以调整原申请空间的大小//使用一个临时的指针来接收,保证p指针数据不丢失if(ptr!=NULL)//判断临时开辟的空间是否失败{p = ptr;ptr=NULL;}for (int i = 0; i < 10;i++){printf("%d ", *(p + i));}free(p);p = NULL;return 0;
}