动态内存管理存放在内存中的堆区中
动态内存分配的函数:malloc、calloc、realloc、free
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-10
for (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;
}