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日

相关文章

  • C++中的类与对象深度解析

    C++中的类与对象深度解析 在C++中,类(class)是一种用户自定义的数据类型,它由数据成员和成员函数组成。类中的数据成员可以是各种类型,包括内置类型、自定义类型以及指针等,成员函数则是负责操作这些数据成员的函数。类可以看做是一种数据的集合和对这些数据的一些操作的封装。 类的定义 定义类的基本语法如下: class 类名 { 访问修饰符: 数据成员声明 …

    C 2023年5月22日
    00
  • C语言 结构体和联合体的区别

    C语言 结构体和联合体的区别 什么是结构体 在 C 语言中,结构体是一种自定义数据类型,它允许程序员将不同类型的变量组合在一起,形成一个数据集合。结构体是由一组多个变量组成的新的数据类型,在定义结构体时,需要定义这个结构体包含的成员变量的类型和名称。 通常定义结构体的方式为: struct 结构体名称{ 成员变量1; 成员变量2; ……….. 成…

    C 2023年5月10日
    00
  • C语言之system函数案例详解

    C语言之system函数案例详解 简介 system函数是C语言标准库中较为常见的一个函数,它能够执行系统命令,并返回运行结果。 system函数的原型为:int system(const char *command)。它接收一个字符串参数,该字符串为要运行的系统命令。 当调用system函数时,会打开一个新的shell进程,并在该进程中执行指定的系统命令。…

    C 2023年5月23日
    00
  • Visual Studio Code运行程序时输出中文成乱码问题及解决方法

    当在Visual Studio Code中运行程序时输出中文出现乱码问题,通常是由于命令行终端的默认字符集与程序输出字符集不一致导致的。下面就详细讲解解决此问题的步骤。 步骤一:查看当前终端默认字符集 运行以下命令查看当前终端默认字符集 chcp 下面是命令输出的结果: 活动代码页: 936 以上结果表示当前终端的默认字符集是“GB2312”。 步骤二:修改…

    C 2023年5月22日
    00
  • C 指针和OC 对象之间的转换方法

    C指针和OC对象之间的转换主要有以下两种方法: 方法一:使用桥接转换 在OC中,可以使用桥接(Bridge)转换来完成C指针和OC对象之间的转换。这种转换方法的原理是通过使用C直接操作OC对象的内存地址,因此需要注意内存管理问题。 1. 将OC对象转换成C指针 将OC对象转换成C指针有两种方法: 使用&取地址符,将OC对象的地址存储到C指针中。例如:…

    C 2023年5月22日
    00
  • C语言栈顺序结构实现代码

    下面我将详细讲解如何用 C 语言实现栈的顺序结构并提供两个示例。 什么是栈? 栈是一种数据结构,特点是 Last In First Out (LIFO) 后进先出。栈具有两个基本操作:压入(push)和弹出(pop)。在栈的顺序结构中,栈被定义为一个固定大小的数组,其中有一个指针(top)指向栈的顶部元素。 栈的顺序结构实现 首先,我们需要定义栈的数据结构,…

    C 2023年5月23日
    00
  • MYSQL数据库Innodb 引擎mvcc锁实现原理

    MYSQL数据库Innodb 引擎mvcc锁实现原理 InnoDB是MySQL数据库的默认存储引擎,实现了被广泛使用的多版本并发控制(MVCC)锁机制,这使得InnoDB的并发处理能力比其他存储引擎更优秀。本文将重点讲解InnoDB的MVCC锁实现原理。 MVCC介绍 MVCC为多版本并发控制(Multi-Version Concurrency Contro…

    C 2023年5月22日
    00
  • C 标准库 ctype.h

    ctype.h 是 C 标准库中的一个头文件,提供了一些用于字符处理的函数。这里详细讲解一下它的使用方法。 ctype.h 头文件的引入 为了使用 ctype.h 头文件,需要在程序中包含它。可以使用以下代码引入: #include <ctype.h> 一些常用的 ctype.h 函数 isalnum() 此函数用于检查字符是否是字母或数字。如果…

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