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/C++ 中可变参数的用法详细解析 在 C/C++ 中,我们可以利用可变参数来实现函数的灵活性和通用性。 在本文中,我们将深入了解可变参数的定义、使用、示例和最佳实践。 什么是可变参数? 可变参数是指函数参数的数量和类型是可变的。通常情况下,我们定义函数时需要指定固定数量和类型的参数,例如: int sum(int a, int b, int c) { r…

    C 2023年5月24日
    00
  • C语言 pthread_create() 函数讲解

    下面我将为你详细讲解“C语言 pthread_create() 函数讲解”的完整攻略。 1. 什么是pthread_create()函数 pthread_create()函数是用于创建新的线程的函数,它通常由程序员在主线程中调用。它的原型如下: #include <pthread.h> int pthread_create(pthread_t *…

    C 2023年5月22日
    00
  • C++顺序表的实例代码

    我来详细讲解一下“C++顺序表的实例代码”的完整攻略。 什么是顺序表? 顺序表是一种线性结构,它的元素在物理上是连续的。顺序表的实现方法是利用数组来存储元素,这个数组称为顺序表的存储空间。 如何实现顺序表? 下面是一份简单的顺序表的实例代码: #include <iostream> using namespace std; #define MAX…

    C 2023年5月24日
    00
  • C程序 比较两个字符串的词性

    下面详细讲解如何使用C程序比较两个字符串的词性。 1. 简介 本C程序用于比较两个字符串的词性是否相同,主要基于基于哈工大的LTP自然语言处理工具实现。 2. 使用攻略 2.1 安装 首先需要安装LTP,可以参考LTP官方文档进行安装。安装完成后,需要将LTP的相关库文件添加到系统环境变量中。 另外,需要安装CMake进行编译。可以在官网上下载对应系统的安装…

    C 2023年5月9日
    00
  • Java IO流之字符流的使用详解

    Java IO流之字符流的使用详解 什么是字符流 字符流是一种能够处理字符数据的流,在字符流中,数据以字符的形式进行读写。 字符流的分类 字符流可以分为两类:输入字符流和输出字符流。其中,输入字符流用于读取字符数据,输出字符流用于写入字符数据。 输入字符流 输出字符流 Reader 抽象类 Writer 抽象类 FileReader 文件字符输入流 File…

    C 2023年5月23日
    00
  • windows系统提示不是内部或外部命令也不是可运行的程序的解决办法

    Windows系统提示不是内部或外部命令也不是可运行的程序的解决办法 当我们在Windows系统中使用命令行或运行可执行文件时,可能会遇到”不是内部或外部命令,也不是可运行的程序”的提示。这通常是因为系统无法找到我们输入的命令或可执行文件所在的路径。下面,我们将详细介绍如何解决这个问题。 常见原因 命令或可执行文件路径错误:Windows系统在使用命令行或执…

    C 2023年5月23日
    00
  • asp.net(C#)解析Json的类代码

    下面我将详细讲解“asp.net(C#)解析Json的类代码”的完整攻略。 1. 什么是Json? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于服务器端和Web应用程序之间的数据传输。它基于JavaScript语言的一个子集,易于人们阅读和编写。JSON采用完全独立于编程语言的文本格式来描述数据。 JSO…

    C 2023年5月23日
    00
  • C++11 并发指南之std::mutex详解

    C++11 并发指南之std::mutex详解 什么是std::mutex? std::mutex是C++11标准中一个用于保护共享数据的同步原语。它是一个轻量级的锁,可以用于实现临界段或者锁保护的互斥访问。当一个线程执行到std::mutex的lock()方法时,如果此前该锁已经被另一个线程占用,那么该线程会被挂起,直到该锁被释放为止。 std::mute…

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