目录
1.引入
在学习动态内存管理之前,我们已经知道的内存开辟方式有:
- int a = 5; //在栈空间上开辟四个字节
- char arr[10] = {0}; //在栈空间上开辟10个字节的连续空间
这两种方式开辟内存空间的方式不同,但有一个共同点就是他们所申请的内存的大小是固定的,无法根据程序的具体需要来分配空间,这样可能会造成内存溢出、内存浪费等问题。
为了适应程序的具体需求,我们可以通过一些动态内存函数来优化程序。
2.动态内存函数的介绍
2.1 mallco
函数原型:
void* malloc (size_t size);
函数所在库:
<stdlib.h>
介绍:
这个函数用于向内存申请一块连续可用的空间,申请的结果有两种情况:
- 系统内存足够,内存空间开辟成功,返回一个指向开辟好空间的起始位置的指针。
- 系统内存不足够,内存空间开辟失败,则返回一个 NULL 指针,因此malloc的返回值一定要检查是否为空。
malloc的返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候由使用者自己来决定。
特别的,如果参数 size 为 0,malloc的行为标准是未定义的,取决于编译器。
2.2 free
函数原型:
`void free (void* ptr);`
函数所在库:
<stdlib.h>
介绍:
free函数在动态内存分配中至关重要,它用于将之前分配的内存块返回给操作系统,以便其他程序可以重新使用它们。这样做可以有效地管理内存,避免内存泄漏问题,并提高程序的性能和资源利用率。
使用free函数是动态内存管理的关键步骤之一,在不再需要分配的内存时务必调用该函数(尤其是在编写较大规模的项目时),以确保内存的正确释放。
特别的,如果参数 ptr 指向的空间不是动态开辟的(比如是一个确定大小的数组),那么free函数的行为是未定义的。并且,当ptr指针是空指针时,free函数什么操作也不会进行。
下面是一个动态申请内存并释放的样例代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* p = (int*)malloc(40);
if (p == NULL)
{
perror("malloc");
return 1;
}
for (int i = 0; i < 10; i++)
{
printf("%d ", *(p + i));
}
free(p); //p指向的位置不存在 -> p 成了野指针
p = NULL;
return 0;
}
2.3 calloc
函数原型:
void* calloc (size_t num, size_t size);
函数所在库:
<stdlib.h>
<