C语言中的动态内存管理
前言
在C语言中当我们采用数组存储数据时,数组必须定义固定的长度,程序运行时数组元素的数目是固定的,,如果定义短了的话程序无法运行,如果定义太大了又显得很浪费。
提示:以下几个函数都包含在stdlib.h头文件中。
一、malloc
在堆区开辟
malloc()
void* malloc(size_t size),唯一的参数是要开辟的字节数,返回值是该内存起始地址且返回值需要检查。
例如开辟10个整型空间:int* p = (int*)malloc(sizeof(int) * 10)
开辟好之后需要进行检查:
if(p == NULL)
{
perror("malloc");//打印错误信息
return 1;//错误返回
}
在栈上开辟空间系统会自动回收,而在堆区开辟空间,需要自己释放。
还有一个和malloc用法相同的alloca(),该函数是在栈区进行内存开辟,不用释放空间。
二、free
释放内存
free()
void free(void* p),唯一参数是需要释放的空间指针,无返回值。
主要作用是将空间回收,在free掉某个空间后,必须将地址置空,否则指针将变为野指针。
free(p);
p = NULL;
三、calloc
开辟内存且元素初始化为0
void* calloc(size_t num, size_t size),第一个参数是元素的个数,第二个参数是元素的字节大小,返回值是该内存起始地址且返回值需要检查。
例如开辟10个整型空间:int* p = (int*)calloc(10,sizeof(int) )
开辟好之后也需要同malloc一样检查。
四、realloc
改变已开辟空间的大小
void* realloc(void* memblock, size_t size ),第一个参数是开辟好的空间指针,第二个参数是更改后的字节大小,返回一个新地址,返回值也需要做检查。
例如将40个字节的内存空间更改为80个字节的内存空间。
int* p = (int*)malloc(sizeof(int) * 10)
if(p == NULL)
{
perror("malloc");//打印错误信息
return 1;//错误返回
}
int * pp = (int*)realloc(p,80);
if(pp != NULL)
p = pp;
错误说明
1.若不对申请的内存空间进行空指针判断,有可能会对空指针解引用;
2.一块内存空间不能多次free;
3.如果忘记释放(且无return 0),会出现内存泄漏。