引言——为什么要有动态内存管理
之前学习过如int a、char arr[10]等开辟空间的方式,其特点是:开辟的空间大小是固定的,一旦确定了大小就不能调整,有时候程序需要根据实际情况改变空间大小。因此,C语言提供了动态内存管理,可以根据需求申请和释放空间。以下是有关动态内存分配的函数
一、malloc和free
size是开辟内存块的大小,以字节为单位
malloc申请到空间后,直接返回这块空间的起始地址,不会初始化空间的内容
malloc申请的内存空间,当程序退出时,还给操作系统;当程序不退出时,动态申请的内存,不会主动释放,需要free函数来释放
malloc和free的头函数为include <stdlib.h>
#include <stdlib.h>
int main()
{
int* ptr = NULL;
ptr = (int*)malloc(10 * sizeof(int));//开辟10*4字节空间
if (NULL == ptr)//判断ptr指针是否为空
{
perror("malloc");
return 1;
}
free(ptr);//释放ptr所指向的动态内存
ptr = NULL;
return 0;
}
二、calloc
为num个大小为size的元素开辟一块空间,并将每个字节初始化为0
与malloc相比,calloc会将字节初始化为0,malloc只开辟空间
#include <stdlib.h>
int main()
{
int* ptr = NULL;
ptr = (int*)calloc(10, sizeof(int));//开辟10*4字节空间
if (NULL == ptr)//判断ptr指针是否为空
{
perror("calloc");
return 1;
}
//打印数据
int i;
for (i = 0; i < 10; i++)
{
printf("%d ", ptr[i]);
}
//释放
free(ptr);//释放ptr所指向的动态内存
ptr = NULL;
return 0;
}
输出结果:0 0 0 0 0 0 0 0 0 0
三、realloc
realloc可以对动态开辟内存的大小进行调整
ptr是要调整的内存地址
size是调整之后的内存大小
realloc在调整内存空间时存在两种情况
情况1:原空间后面有足够的空间
情况2:原空间后面空间不足,需要开辟新空间
#include <stdlib.h>
int main()
{
int* p = NULL;
p = (int*)malloc(10* sizeof(int));//开辟10*4字节空间
if (NULL == p)//判断ptr指针是否为空
{
perror("malloc");
return 1;
}
//初始化为1~10
int i;
for (i = 0; i < 10; i++)
{
p[i] = i;
}
//增加空间
int* ptr = (int*)realloc(p, 80);
if (ptr != NULL)
{
p = ptr;
ptr = NULL;
}
else
{
perror("realloc");
return 1;
}
//打印数据
for (i = 0; i < 20; i++)
{
printf("%d\n", p[i]);
}
//释放
free(p);//释放p所指向的动态内存
p = NULL;
return 0;
}
输出结果:0 1 2 3 4 5 6 7 8 9 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451
注:开辟完判断是不是空指针,用完释放,置空指针
动态内存申请的空间,不会因为出了作用域就自动销毁(还给操作系统)!
free(p);
p=NULL;