本篇文章介绍c语言中实现动态内存管理的库函数,比如malloc()、free()、calloc()、realloc()
在一般情况下,通过以下方式开辟内存空间
int var = 20; //在栈空间开辟4个字节的
char str[10] = {0}; //在栈空间开辟10个字节连续的空间
上面开辟空间的方式有两个特点:
- 开辟空间的大小是固定的,不可变的
- 在栈中开辟,并且在编译时分配空间
当需要在程序运行过程中才能知道所有空间的大小时,这时候就需要动态内存分配。
动态内存分配是指在程序运行过程中,可以动态地向操作系统申请内存空间。
在c语言中,可以借助malloc()、free()、calloc()、realloc()这几个库函数实现动态内存的管理。
下面是cplusplus网站关于malloc()函数的介绍,如下:
作用:申请size个字节内存空间
说明:
返回值说明:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>
int main()
{
//申请40个字节
int* p = (int*)malloc(40);
//判断申请是否成功
if (NULL == p)
{
printf("%s", strerror(errno));
return 1;
}
//使用空间
int i = 0;
int sz = 40 / sizeof(int);
for (i = 0; i < sz; i++)
{
*(p + i) = i;
}
//打印
for (i = 0; i < sz; i++)
{
printf("%d ", *(p + i));
}
//使用完之后,释放空间
free(p);
p = NULL;
return 0;
}
下面是cplusplus网站关于free()函数的介绍,如下:
作用:释放通过malloc()、calloc()、realloc()函数申请的空间
说明:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>
int main()
{
//申请40个字节
int* p = (int*)malloc(40);
//判断申请是否成功
if (NULL == p)
{
printf("%s", strerror(errno));
return 1;
}
//使用空间
int i = 0;
int sz = 40 / sizeof(int);
for (i = 0; i < sz; i++)
{
*(p + i) = i;
}
//使用完之后,释放空间
free(p);
p = NULL;
return 0;
}
通过vs的内存监视查看(未释放前)
利用free()释放p指向的空间后
通过结果得出,free(p)
释放p指向的空间后,p的指向没有改变,为了避免越界访问,因此可以将p = NULL