C语言 动态内存分配的详解及实例

C语言 动态内存分配的详解及示例

什么是动态内存分配

在编程中,有时我们需要根据实际情况动态地分配内存空间,而不是在编写时就预先分配好。这种内存分配方式被称为动态内存分配。动态内存分配可以避免预分配内存的浪费,同时还可以根据需要扩充内存。

C语言中提供了四个用于动态内存分配的库函数,分别是 malloccallocreallocfree

  • malloc 函数用于分配一块指定大小的内存空间,并返回一个指向它的指针;
  • calloc 函数分配一块指定数量和大小的内存空间,并初始化为0,其返回值也是指向该内存块的指针;
  • realloc 函数用于改变原来已分配内存的大小,并返回修改后的内存空间首地址;
  • free 函数用于释放已经分配的内存空间。

动态内存分配实例

一维数组的动态内存分配

#include <stdio.h>
#include <stdlib.h>
int main() {
    int n, i;
    scanf("%d", &n);
    int *a = (int *) malloc(n * sizeof(int)); //分配一维数组

    for (i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }

    for (i = 0; i < n; i++) {
        printf("%d ", a[i]);
    }

    free(a); //释放内存
    return 0;
}

在上述示例中,我们通过 malloc() 函数动态地分配了一个包含 n 个整数的一维数组,并用指针变量 a 指向了这个数组。随后,用户输入了该数组的各个元素,最后依次输出这些元素,并通过 free() 函数释放了已分配的内存空间。

二维数组的动态内存分配

#include <stdio.h>
#include <stdlib.h>
int main() {
    int row, col, i, j;
    scanf("%d%d", &row, &col);
    int **a = (int **) malloc(row * sizeof(int *)); //分配二维数组整体

    for (i = 0; i < row; i++) {
        a[i] = (int *) malloc(col * sizeof(int)); //为二维数组的每行分配一维数组
        for (j = 0; j < col; j++) {
            scanf("%d", &a[i][j]);
        }
    }

    for (i = 0; i < row; i++) {
        for (j = 0; j < col; j++) {
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }

    for (i = 0; i < row; i++) {
        free(a[i]); //释放每行的内存空间
    }

    free(a); //释放整体内存空间
    return 0;
}

该示例中,我们通过 malloc() 函数动态地分配了一个包含 row 行、col 列的二维数组,并用指针变量 a 指向了其整体。随后,我们为二维数组的每一行分别动态分配了一维数组,用于存储该行的元素。接口用户依次输入了各个元素,最终输出整个数组,并通过 free() 函数按先行后列的顺序释放了动态分配的内存空间。

小结

本文主要讲解了C语言中动态内存分配的详细知识以及两个实例,希望读者能够掌握在实际程序中使用这些函数的方法。 需要注意的是,使用 malloc() 及其相关函数前应该了解程序所需的内存空间大小,同时强烈建议在使用完毕后及时释放动态分配的内存空间。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言 动态内存分配的详解及实例 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • win10系统自带的计算器C和CE功能有什么区别?

    当我们使用win10系统自带的计算器时,会发现有两个按钮分别标注为“C”和“CE”,这两个按钮的作用都是清空计算器上的内容。但是,它们之间存在着一些区别。 首先,C是Clear的缩写,即清除所有计算器上的数字,包括之前的计算结果。而CE是Clear Entry的缩写,即只清除计算器上当前输入栏中的数字,之前的计算结果不会被修改或影响。 接下来,我将用两条示例…

    C 2023年5月22日
    00
  • odbcasvc.exe导致CPU使用100%问题的解决办法

    下面是详细讲解“odbcasvc.exe导致CPU使用100%问题的解决办法”的完整攻略。 问题描述 在使用Windows操作系统时,可能会遇到odbcasvc.exe进程占用CPU使用率高的问题,导致电脑变得卡顿、反应慢等。该进程是ODBC服务组件的一部分,主要用于数据库的访问,因此出现问题需要及时解决。 解决办法 停止odbcasvc.exe进程 可能是…

    C 2023年5月23日
    00
  • 详解vs2022创建及调用.lib的方法

    下面是详解vs2022创建及调用.lib的方法。 1. 创建.lib文件 1.1 在Visual Studio 2022中创建新项目 打开Visual Studio 2022,点击“文件”菜单,选择“新建”和“项目”。 在“新建项目”窗口中,选择“Visual C++” -> “Windows桌面” -> “空项目”。然后为项目命名,例如“Dem…

    C 2023年5月23日
    00
  • c语言main函数使用及其参数介绍

    C语言main函数使用及其参数介绍 在C语言程序中,主函数(main函数)是程序的入口,它负责整个程序的执行。main函数的形式如下: int main(int argc, char *argv[]) { //程序语句 return 0; } main函数包括三部分,分别是函数头、函数体和返回值。下面我们对这三部分进行详细介绍。 一、函数头 main函数的函…

    C 2023年5月23日
    00
  • C++中的整形字节数

    当我们在C++中定义整型变量时,我们必须指定该变量的整型类型。不同的整型类型在内存中使用的字节数不同,并且可以容纳的数值范围也不同。在C++中,整型类型可以使用signed和unsigned修饰符。下面是C++中整型类型和它们在内存中使用的字节数的列表: 类型 字节数 范围 short(短整型) 2 有符号:-32768到32767,无符号:0到65535 …

    C 2023年5月23日
    00
  • Visual Studio Code 配置C、C++ 文件debug调试环境的详细过程

    下面是Visual Studio Code配置C/C++文件debug调试环境的详细过程: 安装必要的软件 在开始配置之前,需要先安装以下软件: Visual Studio Code:用于代码编辑和调试 MinGW:用于编译C/C++代码 C/C++插件:用于在Visual Studio Code中编写C/C++代码 配置调试环境 打开Visual Stud…

    C 2023年5月23日
    00
  • 带你理解C语言中的汉诺塔公式

    下面是 “带你理解C语言中的汉诺塔公式” 的完整攻略: 1. 汉诺塔问题简介 汉诺塔问题是著名的递归问题。汉诺塔的玩具包括三个柱子和一些大小不同的盘子,开始时所有的盘子都按大小顺序堆叠在一个柱子上,目标是把它们移动到另一个柱子上,移动过程中要遵循以下规则: 每次只能移动一个盘子。 移动盘子时,只能把较小的盘子放在较大的盘子上面。 拿“汉诺塔问题”来说,假如有…

    C 2023年5月22日
    00
  • Qt基础开发之Qt多线程类QThread与Qt定时器类QTimer的详细方法与实例

    首先我们来讲解一下Qt多线程类QThread的使用方法: Qt多线程类QThread的使用方法 1. 创建继承自QThread的子类 在Qt中我们通常使用继承自QThread的子类来创建新的线程。首先我们需要在头文件中#include ,然后创建一个新类,继承自QThread。在新类的run()函数中实现线程的具体逻辑。 示例代码: #include &lt…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部