一、动态内存管理
动态内存管理由
- 内存的申请
- 内存的释放
构成 , 这里的内存指的是 堆内存 , 与之相对的是 栈内存 ;
在 程序运行时 过程中 , 经常 根据需要 进行动态内存管理 , 从而更加灵活地管理内存资源 , 包括 :
- 分配 堆内存 中的 内存空间
- 释放 堆内存 中的 内存空间
C 语言 和 C 语言 中 , 都有 动态 分配 / 释放 堆内存 的方法 ;
- C 语言中 , 主要是 堆内存的 分配 与 释放 ;
- C 语言中 , 主要是 对象的动态建立和释放 ;
二、C 语言中的动态内存管理
1、C 语言 内存申请
在 C 语言中 , 使用malloc()、calloc()、realloc() 等标准库函数来动态地申请内存 :
- malloc(size_t size) : 分配指定字节大小的堆内存 , 返回一个指向堆内存空间的指针 , 失败则返回 NULL ;
- calloc(size_t num, size_t size): 分配指定 块数 和 字节大小的 堆内存 , 与 malloc 对比 calloc 自动将内存初始化为 0 ;
- realloc(void* ptr, size_t size) : 修改已分配内存块的字节大小 ; 如果 指针参数 ptr 为 NULL , 则该函数与 malloc 函数功能相同 ; 如果 参数 size 为 0 , 则该函数 与 free 函数功能相同 , 用于释放 ptr 内存 ;
调用上述函数前 , 需要导入 stdlib.h 头文件 ;
代码语言:javascript复制#include <stdlib.h>
2、C 语言 内存释放
在 C 语言中 , 调用 free() 标准库函数 释放已申请的内存 ;
3、代码示例 - C 语言动态内存管理
在下面的代码中 ,
首先 , 使用 malloc() 函数 动态地申请了 可以存放 5 个 int 数据的 堆内存 ,
代码语言:javascript复制// 函数原型 :
void *malloc(unsigned int size);
然后 , 将 malloc 函数返回的 void * 类型的指针转为 int * 类型的指针 ;
代码语言:javascript复制// 函数原型 :
// void *malloc(unsigned int size);
// 申请内存
int* array = (int*)malloc(5 * sizeof(int));
再后 , 使用数组下标的方式访问内存 , 为内存赋值 ;
代码语言:javascript复制 // 为内存赋值
// 赋值时使用数组下标的方式访问内存
for (int i = 0; i < 5; i ) {
array[i] = i;
}
再后 , 打印内存数据 , 获取内存空间值时使用指针形式访问内存 ;
代码语言:javascript复制 // 打印内存
// 获取内存空间值时使用指针形式访问内存
for (int i = 0; i < 5; i ) {
printf("%d ", *(array i));
}
最后 , 调用 free 函数释放这块内存 ;
代码语言:javascript复制 // 释放内存
free(array);
代码示例 :
代码语言:javascript复制#include <stdio.h>
#include <stdlib.h>
int main() {
// 申请内存
int* array = (int*)malloc(5 * sizeof(int));
if (array == NULL) {
printf("内存分配失败n");
return -1;
}
// 为内存赋值
// 赋值时使用数组下标的方式访问内存
for (int i = 0; i < 5; i ) {
array[i] = i;
}
// 打印内存
// 获取内存空间值时使用指针形式访问内存
for (int i = 0; i < 5; i ) {
printf("%d ", *(array i));
}
printf("n");
// 释放内存
free(array);
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
}
执行结果 :
代码语言:javascript复制0 1 2 3 4
请按任意键继续. . .