目录
一、动态内存分配是什么?
动态内存分配是指在程序执行的过程中,系统根据程序的需要动态地分配或回收存储空间的分配内存的方法。
这种分配方式不像数组等静态内存分配方法那样,需要预先指定要分配的内存大小,且一经分配后大小无法修改,而是由系统按程序的需要灵活地分配和回收内存空间。
二、为什么需要动态内存分配?
在C99引入变长数组前,定义数组时大小不能是变量,这就导致了开辟数组时必须指定数组的大小,且一经开辟,数组的大小再也无法改变。但实际情况下,如实现一个通讯录时,我们往往不知道需要多大的数组,且经常会遇到数组容量不够的情况,这就是静态内存分配的弊端。
早期的解决方案就是使用动态内存分配,也就是使用四个库函数:malloc、calloc、 realloc、free对堆区的内存进行更灵活的分配和回收。
使用动态内存分配的优势:
- 可以灵活分配、回收内存:
与大小固定的数组相比,动态内存分配可以使用malloc、calloc申请分配内存,使用relloc对申请好的内存空间大小进行调整,使用free回收内存。- 可以随时回收,多次利用这部分空间:
静态内存分配的空间,直到整个程序结束才会由系统自动释放。但是动态内存分配的空间需要用户手动释放,所以我们可以在使用完后立马通过free函数空间,使得这块空间能在一个程序中被反复使用,这样也能在一定程度上节省内存空间。- 使用内存中堆区的空间
动态内存分配是在堆上分配空间的,静态内存分配是在栈上分配空间的,所以了解动态内存分配后就能使用堆上的空间了。
三、怎么进行动态内存分配?
C语言中动态内存管理方式是通过四个库函数实现的:malloc、calloc、 realloc、free。这四个库函数都在头文件<stdlib.h>中。
1. malloc
| 函数声明 | void* malloc (size_t size); |
| 功能 | 在堆上申请一个大小为size字节的空间。(申请分配动态内存) |
| 返回值 | 若申请成功,返回一个指向该空间开头的指针;若失败,则返回空指针。 |
#include<stdio.h>
#include<stdlib.h>
int main()
{
// 开辟一个动态内存变量
//malloc函数的返回值类型为void*所以要强制类型转换
int* a = (int*)malloc(1 * sizeof(int));
// 检查动态内存是否开辟失败,开辟失败返回NULL
if (NULL == a)
{
printf("动态内存开辟失败。\n");
return 0;
}
// 使用动态内存
*a = 1;
printf("%d\n", *a);
// 释放动态内存
free(a);
a = NULL; //free后指针仍指向原来的空间,所以要置为NULL
}
// 开辟一个动态内存数组
int size = 10; // 动态内存数组大小
int* arr = (int*)malloc(size * sizeof(int));
// 检查动态内存是否开辟失败
if (NULL == arr)
{
printf("动态内存开辟失败。\n");
return 0;
}
// 使用动态内存数组(和静态内存数组的使用没有差别)
for (int i = 0; i < size; ++i

本文详细介绍了动态内存分配的概念、原因、C语言中malloc、calloc、realloc和free的使用方法,以及动态内存分配中可能出现的问题和面试题示例。
最低0.47元/天 解锁文章
1312

被折叠的 条评论
为什么被折叠?



