C语言通过库函数实现动态内存管理,使用动态内存管理函数时需要使用预编译指令#include包含头文件stdlib.h。
动态内存分配函数malloc
声明格式:
void *malloc(size);
void * 表明函数malloc的返回值时void * 类型的
size表明该函数向内存申请size个字节的连续存储空间
如:
int *p; //声明一个指针变量p
p = (int*)malloc(sizeof(int));
//malloc(sizeof(int)) 向内存申请4B的空间
//(int*)将函数malloc的返回值void*类型转化int*类型
//当函数malloc申请空间失败时(如空闲内存不足4B),函数malloc的返回值为NULL,宏NULL的值为0
//当成功时,函数会返回该内存空间的首地址
连续内存动态分配函数calloc
声明格式:
void *calloc(n,size);
void * 表明函数calloc的返回值时void * 类型的
n,size表明该函数向内存申请n个size个字节的连续存储空间
如:
注:与malloc不同的地方在于分配的内存初始化为0
#include<stdio.h>
#include<stdlib.h>
int main()
{
char *p;
p = (char*)calloc(10, sizeof(char));
if (p == NULL)
{
printf("内存分配失败!");
exit(1); //程序异常退出
}
}
内存分配调整函数realloc
realloc用于变更已分配内存空间的大小。
①内存空间变大:新增的空间的内容清零
②内存空间变小:被缩小的那部分空间的数据丢失,其余不变
声明格式:
void * realloc(p,size);
void * 表明函数realloc的返回值时void * 类型的
p 是需要变更空间的首地址
size 是变更后内存内存空间的大小
如:
#include<stdio.h>
#include<stdlib.h>
int main()
{
char *p;
p = (char*)realloc(10, sizeof(char));
if (p == NULL)
{
printf("内存分配失败!");
exit(1); //程序异常退出
}
p = (char*)realloc(p, 20); //把原有的空间扩大到20B
if (p == NULL)
{
printf("内存分配失败!");
exit(1); //程序异常退出
}
}
动态内存释放函数free
声明格式:
void free( p );
用于释放动态内存分配函数所分配的空间
void 表明函数无返回值
p 是所要释放内存的首地址。
如果p==NULL,那么函数free什么也不做
char *p;
p = (char*)realloc(10, sizeof(char));
if (p == NULL)
{
printf("内存分配失败!");
exit(1); //程序异常退出
}
........ //使用p
free(p); //使用完p了,释放p
*p = 'A'; //已经p把内存释放了,不能再使用p
}