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

yizhihongxing

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日

相关文章

  • Cocos2d-x中获取系统时间和随机数实例

    获取系统时间: 在 Cocos2d-x 中获取系统时间可以使用 C++ 标准库中的 ctime 头文件,用 std::time() 函数获取当前系统时间的时间戳,再将时间戳转换为字符串以实现格式化输出。 示例代码: #include <ctime> #include <string> … std::time_t now = std…

    C 2023年5月30日
    00
  • C 函数指针与回调函数

    C 函数指针 C 函数指针是一个指向函数的指针变量,它存储的是函数的地址,通过该函数指针可以调用被指向的函数。函数指针可以用来实现动态回调,灵活地调用不同的函数,是 C 语言中非常重要的概念之一。 函数指针的定义格式如下: 返回值类型 (* 指针变量名) (参数列表); 例如,定义一个函数指针,指向一个返回值为整型,带一个整型参数的函数,可以这样写: int…

    C 2023年5月10日
    00
  • 如何快速辨别USB Type-C数据线的好与坏?

    当购买USB Type-C数据线时,要注意以下几点: 步骤一:看外观 数据线的外观可以直接反映其质量。一般而言,好的USB Type-C数据线的线材会采用高质量的材料,比如高纯度铜线或高密度尼龙编织线,手感较为舒适,并且线料表面会进行人性化的设计,如添加防滑纹路。此外,好的USB Type-C数据线会采用高质量的接头,面料通常会采用金属材质,防止耐用性下降。…

    C 2023年5月23日
    00
  • C语言一个函数如何实现好几个return返回值

    在C语言中,一个函数可以实现多个return返回值,主要是通过条件分支语句来实现的。通常在编写函数时,我们需要在不同的条件下返回不同的值。下面是我总结的实现方法和示例。 实现方法 实现一个函数有多个返回值可以采用以下三种方法: 全部使用if/else的方式进行判断,每个分支在结尾return不同的值; 使用switch语句,每个case分支在结尾return…

    C 2023年5月23日
    00
  • C#创建线程带参数的方法

    C#创建线程带参数的方法,可以通过委托和Lambda表达式实现。以下是详细的攻略: 委托和Lambda表达式的简介 委托是C#中一个非常重要的概念,它是一种指向方法的指针,能够在需要的时候再调用这个方法。Lambda表达式是C#3.0引入的一项新特性,它是一种简化创建委托的语法。Lambda表达式实质是一个匿名函数,总是由多个参数,一个箭头符号和一个表达式组…

    C 2023年5月22日
    00
  • C语言 详解如何删除有序数组中的重复项

    C语言详解如何删除有序数组中的重复项 在C语言中,要删除有序数组中的重复项,可以使用双指针法来实现。具体步骤如下: 定义两个指针p和q,分别指向数组的第一个元素。 使用循环遍历数组,当q指针所指向的元素与p指针所指向的元素相同时,q指针向后移动一位,即跳过该重复项。 当q指针所指向的元素与p指针所指向的元素不同时,将q指针所指向的元素赋值给p指针的下一个位置…

    C 2023年5月23日
    00
  • python中的Json模块dumps、dump、loads、load函数用法详解

    下面是关于 Python 中的 Json 模块 dumps、dump、loads、load 函数的使用详解: Json 简介 Json是一种基于文本的轻量级数据交换格式,常用于前后端数据交互、配置文件等场合。在 Python 中,可以使用 Json 模块来对 Json 数据进行解析和生成。 Json 模块函数说明 dumps 函数 dumps 函数将一个 P…

    C 2023年5月23日
    00
  • C语言实现求解素数的N种方法总结

    C语言实现求解素数的N种方法总结 简介 本文将总结C语言实现求解素数的N种方法。素数是只能被1和本身整除的正整数,对于计算机编程而言,求解素数是一个常见的问题。本文将介绍7种解决大约从100以内寻找素数至大约1百万以内寻找素数的方法。 方法一:暴力枚举 对于一个数n,从2开始枚举到sqrt(n)为止,判断n是否能被2~sqrt(n)中的任一数整除。如果n不能…

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