C语言 动态分配数组案例详解

C语言动态分配数组案例详解

什么是动态分配数组

在C语言中,数组是一种非常基础的数据类型,它可以容纳一组相同类型的数据,而且数组的长度是静态的,也就是在声明时就要确定数组的长度。比如:

int arr[10]; //声明了一个长度为10的整型数组

但是,在很多情况下,我们并不知道数组要存储多少个元素,或者存储元素数量会发生变化。此时,就需要采用动态分配数组的方式。

动态分配数组就是在程序运行时动态地分配一段内存空间,用于存储数组元素。动态分配数组的长度是在程序运行时根据实际需要进行分配的。

动态分配数组的声明和使用

动态分配数组的声明和使用需要掌握两个库函数:malloc和free。其中,malloc函数用来动态分配内存空间,它的调用方式如下:

void *malloc(size_t size);

其中,size_t类型是一个无符号整型,表示要分配的内存大小,单位是字节。这个函数返回一个void类型的指针,指向分配到的内存空间的起始位置。如果分配失败,返回值为NULL。

使用malloc分配数组时,需要注意,它只分配了一段连续的内存空间,并不会初始化数组元素的值。因此,需要使用循环语句将数组元素逐个初始化。

使用完毕后,需要使用free函数将分配的内存空间释放,以免造成内存泄漏。

下面,就来看两个动态分配数组的示例。

示例一:动态分配一维数组

#include <stdio.h>
#include <stdlib.h> //malloc函数所在的头文件

int main()
{
    int *arr; //声明一个指向整型的指针
    int len; //用于存放要分配的数组长度
    int i; //循环计数器

    printf("请输入要分配的数组长度:");
    scanf("%d", &len);

    arr = (int*)malloc(len * sizeof(int)); //动态分配数组的内存空间

    if(arr == NULL) //分配失败
    {
        printf("动态分配内存空间失败!\n");
        return -1;
    }

    //逐个初始化数组元素
    for(i = 0; i < len; i++)
    {
        printf("请输入第%d个元素的值:", i + 1);
        scanf("%d", &arr[i]);
    }

    //打印数组元素
    printf("您输入的数组元素为:");
    for(i = 0; i < len; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");

    free(arr); //释放动态分配的内存空间

    return 0;
}

这段代码演示了如何动态分配一个一维数组,并且逐个初始化数组元素。请注意,在使用malloc分配数组内存时,需要先将void类型的指针强制类型转换为对应的数组类型指针,故而在arr的声明语句中要进行强制转换:

arr = (int*)malloc(len * sizeof(int));

示例二:动态分配二维数组

#include <stdio.h>
#include <stdlib.h> //malloc函数所在的头文件

int main()
{
    int **arr; //声明一个指向二维整型数组的指针
    int row, col; //用于存放行数和列数
    int i, j; //循环计数器

    printf("请输入要分配的数组的行数和列数,中间用空格隔开:");
    scanf("%d %d", &row, &col);

    //动态分配二维数组的内存空间
    arr = (int**)malloc(row * sizeof(int*)); //分配一维的指针数组
    for(i = 0; i < row; i++) //逐个分配一维数组的内存空间
    {
        arr[i] = (int*)malloc(col * sizeof(int));
    }

    //逐个初始化数组元素
    for(i = 0; i < row; i++)
    {
        for(j = 0; j < col; j++)
        {
            printf("请输入第%d行第%d列的元素值:", i + 1, j + 1);
            scanf("%d", &arr[i][j]);
        }
    }

    //打印数组元素
    printf("您输入的二维数组元素为:\n");
    for(i = 0; i < row; i++)
    {
        for(j = 0; j < col; j++)
        {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }

    //释放动态分配的内存空间
    for(i = 0; i < row; i++)
    {
        free(arr[i]);
    }
    free(arr);

    return 0;
}

这段代码演示了如何动态分配一个二维数组。和一维数组不同的是,二维数组实际上可以看成是由若干个一维数组组成的。因此,在动态分配二维数组时,需要先分配一维指针数组的内存空间,再逐个分配每个一维数组的内存空间,并将每个一维数组的指针存入二维指针数组中。

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

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

相关文章

  • java+MongoDB实现存图片、下载图片的方法示例

    接下来我将详细讲解“java+MongoDB实现存图片、下载图片的方法示例”的完整攻略。 1. 简介 MongoDB是一个NoSQL数据库,它简化了复杂查询和数据模型。它很好地支持面向文档的数据存储,使得存储和检索图片等二进制数据变得更容易。Java是一种广泛使用的编程语言,支持面向对象编程。它也非常适合用于与MongoDB一起工作,以实现存储和检索二进制数…

    人工智能概论 2023年5月25日
    00
  • Centos 通过 Nginx 和 vsftpd 构建图片服务器的教程(图文)

    接下来我将详细讲解“Centos 通过 Nginx 和 vsftpd 构建图片服务器的教程(图文)”的完整攻略。 1. 确认环境 在开始构建图片服务器之前,我们需要确认以下环境: 操作系统:CentOS 7 Web 服务器:Nginx FTP 服务器:vsftpd 如果您的环境满足以上要求,那么就可以开始构建图片服务器了。 2. 安装 Nginx 首先我们需…

    人工智能概览 2023年5月25日
    00
  • 详解微信小程序自定义组件的实现及数据交互

    下面我给出详解微信小程序自定义组件的实现及数据交互的完整攻略。内容分为以下几部分: 自定义组件的概念及基本用法 自定义组件的实现步骤 自定义组件与页面的数据交互 示例说明 1. 自定义组件的概念及基本用法 自定义组件是一种可以重复使用的自定义元素,由类似视图和逻辑的 WXML, WXSS 和 JS 结合而成。一般情况下,自定义组件的结构是由: wxml 文件…

    人工智能概论 2023年5月25日
    00
  • 安装Ubuntu20.04与安装NVIDIA驱动的教程

    下面是安装Ubuntu 20.04和安装NVIDIA驱动的教程。 安装Ubuntu 20.04 下载Ubuntu 20.04的镜像 在官网上下载Ubuntu 20.04的镜像文件,可以是Desktop或Server版本。下载地址:https://ubuntu.com/download 制作U盘启动盘 使用制作启动盘工具将Ubuntu 20.04镜像写入U盘中…

    人工智能概览 2023年5月25日
    00
  • pytorch中关于distributedsampler函数的使用

    PyTorch是一个广泛使用的深度学习框架,可用于构建高效的神经网络模型。在PyTorch中,DistributedSampler函数被用于支持分布式数据并行训练。该函数使用多个CPU或GPU资源来运行训练。在这里,我们将对DistributedSampler函数进行全面的介绍,包括其用法、示例说明等内容。 DistributedSampler函数的作用 D…

    人工智能概论 2023年5月25日
    00
  • EVGA GeForce GTX 1060 FTW+GAMING显卡评测和拆解图

    EVGA GeForce GTX 1060 FTW+GAMING显卡评测和拆解图 EVGA GeForce GTX 1060 FTW+GAMING显卡是一款高性能显卡,下面我们将给出它的评测和拆解图。 性能测试 我们使用以下测试平台进行了测试: CPU: Intel Core i7-8700K 内存: 16GB DDR4 显示器: ASUS VG279Q 在…

    人工智能概览 2023年5月25日
    00
  • Django如何继承AbstractUser扩展字段

    我可以为你详细讲解如何在Django中继承AbstractUser模型扩展字段的攻略。下面是详细步骤: 1.创建一个新的User模型 首先,在你的Django项目中,需要先创建一个新的User模型。可以在models.py文件中定义这个新模型。通过继承AbstractUser类创建一个新的User类。这个新类将继承AbstractUser的所有功能和属性,同…

    人工智能概论 2023年5月24日
    00
  • Go实现分布式系统高可用限流器实战

    Go实现分布式系统高可用限流器实战攻略 什么是限流器? 限流器是用来控制流量的一种重要工具。在分布式系统中,限流器可以帮助我们控制流量并且保证系统的稳定运行。 Go实现分布式系统高可用限流器的步骤 以下是Go实现分布式系统高可用限流器的步骤: 1. 定义限流器的数据结构 我们需要定义一个结构体来表示限流器。这个结构体包含以下字段: 每秒钟可以处理的请求数 r…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部