文章目录
为什么存在动态内存管理?
#include <stdio.h>
int main()
{
int arr[20] = {
0 };
return 0;
}
上述代码中的arr数组已经被我们创立,但这样设计代码可能会有一定的缺陷,如果当我们所需要用的数据超过 arr数组的长度时,会形成数组越界,而造成语法出错。这时,动态内存分配管理便由此而出。
动态内存管理相关函数
malloc 和 free
C语言为我们提供了相应的动态内存管理函数。首先我们将要了解的是开辟动态内存空间的 malloc 和释放动态内存空间的 free。
malloc
函数原型:void malloc (size_t size);
size_t size 表示malloc所创建的空间是我们自己决定和创建的,其大小为字节。如size为0时,这是标准没有定义的,结果取决于编译器自身。
void* 表示可以返回任意类型的指针,使用我们在使用malloc时,一定要强制类型转换成我们自己所需要的
注:
当我们使用malloc向内存开辟空间时, malloc会有两种情况:
(1)当malloc开辟成功时,返回一个指向开辟好空间的指针
(2)当malloc开辟失败是,返回一个NULL指针,所以在使用malloc开辟空间后,一定要判断malloc是否开辟成功。
free
C语言同时也提供个释放和回收动态内存的函数:free
函数原型: void free (void ptr);
ptr 表示了在使用free函数时,需要我们将动态空间的首地址传输给free,
同时free并不需要返回值
注:
在使用完free后, 一定要将 ptr 赋成NULL。
以代码举例
#include <stdio.h>
//使用malloc和free时需要引的头文件
#include <stdlib.h>
int main()
{
//代码1
int num = 0;
scanf("%d", &num);
int arr[num] = {
0 };//C99中存在
//代码2
int* ptr = (int*)malloc(10 * sizeof(int));
if (ptr == NULL)
{
return;//如果ptr开辟失败,程序直接结束
}
free(ptr);
ptr = NULL;//必须赋为NULL
return 0;
}
calloc
C语言除了malloc可以