【C++】动态内存管理 ① ( C 语言中的动态内存管理 | C 语言 内存申请 | C 语言 内存释放 | 代码示例 )

2023-10-15 17:14:00 浏览数 (1)

一、动态内存管理

动态内存管理由

  • 内存的申请
  • 内存的释放

构成 , 这里的内存指的是 堆内存 , 与之相对的是 栈内存 ;

在 程序运行时 过程中 , 经常 根据需要 进行动态内存管理 , 从而更加灵活地管理内存资源 , 包括 :

  • 分配 堆内存 中的 内存空间
  • 释放 堆内存 中的 内存空间

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
请按任意键继续. . .

0 人点赞