目录
如今令我们所熟知的开辟内存的方法也就两种一种是在栈区定义的局部变量,还有一种就是在静态区定义全局变量和静态变量, 而且它们的大小并不能随心所欲的变化。而这篇文章将介绍的是可以随时更改大小的内存开辟方法。
本篇介绍的所有函数的头文件都是:stdlib.h
malloc
首先我们先来认识第一个函数malloc:
void* malloc (size_t size);
它可以在堆区为用户开辟size个字节大小的连续空间,并返回一个该内存块的首地址。
- 如果开辟成功,则返回一个指向开辟好空间的指针。
- 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
- 返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己 来决定。
- 如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。
一般的使用方法为:
int* p = NULL;
p = (int*)malloc(4 * sizeof(int));
if (p == NULL)
{
perror("malloc");
return 0;
}
//判断完成后再使用malloc开辟的内存
calloc
void* calloc (size_t num, size_t size);
这就是今天介绍的第二个函数,它会根据你需要的数据个数(num)和每个数据的大小(size单位:字节)来为你在堆区开辟一块内存并进行初始化。
malloc: calloc:
char* p1 = NULL; char* p2 = NULL;
p1 = (char*)malloc(4 * sizeof(char)); p2 = (char*)calloc(4 , sizeof(char));
可以看出calloc将开辟的内存都初始化为了0;
realloc
void* realloc (void* ptr, size_t size);
如果你第一次开辟的内存在后面的使用过程中空间不够了除了重新开辟之外还可以使用realloc函数,这个函数将根据你传入的旧空间的地址和新空间的大小来改变旧空间的大小,然后返回新空间的首地址。如果开辟失败会返回NULL。
注:如果后面的空间不足就会重新开辟一块空间并将旧空间里面的值拷贝到新空间。
free
void free (void* ptr);
注意malloc和calloc,realloc所开辟的内存都不会自动消失。free函数就是当用户将动态开辟的内存的首地址传给它时,它就会将这块内存回收。
动态开辟的内存被回收只有两种情况:
- 程序结束时会被回收;
- 主动使用free函数将申请的内存回收。
- free函数用来释放动态开辟的内存。
- 如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。
- 如果参数 ptr 是NULL指针,则函数什么事都不做。