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

yizhihongxing

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日

相关文章

  • django 实现celery动态设置周期任务执行时间

    下面我来详细讲解如何使用Django和Celery实现动态设置周期任务执行时间的攻略: 1. 确认开发环境 在开始使用Django和Celery之前,需要确保已经安装了以下依赖工具: Python 3.x Django Celery Redis 关于这些工具的具体安装和配置,可以查看官方文档进行了解。 2. 创建Django项目和Celery应用 在确认好开…

    人工智能概览 2023年5月25日
    00
  • Nginx 请求压缩的实现(动态压缩,静态压缩)

    实现 Nginx 请求压缩可以大大减少网络传输时间和带宽使用,提高网站性能。Nginx 支持动态压缩和静态压缩两种方式来实现请求压缩,下面是详细的实现攻略。 动态压缩 动态压缩指的是在 Nginx 服务器上动态生成页面时,将页面内容压缩后返回给客户端浏览器。常用的压缩方式包括 Gzip 和 Brotli。 第一步:安装压缩模块 首先需要在 Nginx 上安装…

    人工智能概览 2023年5月25日
    00
  • 关于Django使用 django-celery-beat动态添加定时任务的方法

    关于Django使用django-celery-beat动态添加定时任务的方法 Django是一个开放源代码的高层次Python Web框架。开发人员可以利用Django的许多条款和模块来开发完整的Web应用程序。而celery是Python语言使用的一个异步任务队列,它轻量级、高效,可靠,非常适用于处理高并发的异步任务。而django-celery-bea…

    人工智能概览 2023年5月25日
    00
  • Android音视频之视频采集(系统API预览)

    来分享一下 Android 音视频之视频采集(系统 API 预览)的完整攻略。 一、什么是视频采集? 视频采集是将外部环境中的视频信号转换成数字信号的过程,是实现视频录制、视频直播等功能必备的第一步。 二、Android 系统 API 预览实现视频采集 1. 相机设备 Android 的视频采集可通过相机设备实现。要获取相机设备,需要使用 Camera AP…

    人工智能概览 2023年5月25日
    00
  • Rabbitmq延迟队列实现定时任务的方法

    下面是详细讲解“Rabbitmq延迟队列实现定时任务的方法”的完整攻略。 一、Rabbitmq延迟队列简介 Rabbitmq延迟队列,也叫死信队列(Dead Letter Exchange),是Rabbitmq提供的一个重要功能。它可以用于延迟一些任务的执行,或者将超时未处理的消息转移到其他队列中等。 二、实现方法 1.创建延迟队列 首先需要创建一个延迟队列…

    人工智能概览 2023年5月25日
    00
  • pytorch中的weight-initilzation用法

    下面我将为您详细讲解pytorch中的weight-initilzation用法的完整攻略。 什么是weight initialization weight initialization指的是神经网络权重初始化的方法。在神经网络中,权重对于模型的训练和性能至关重要。适当的权重初始化可以加快训练速度,提高模型精度。 通常,我们可以采用随机初始化的方式来对神经网…

    人工智能概论 2023年5月25日
    00
  • 修改Nginx与Apache上传文件大小限制

    针对修改Nginx和Apache上传文件大小限制的问题,我将为您分享以下完整攻略。 修改Nginx上传文件大小限制 Nginx的上传文件大小限制包括两个参数,分别为client_max_body_size和client_body_buffer_size。 1. 修改client_max_body_size 第一步,修改Nginx配置文件中的client_ma…

    人工智能概览 2023年5月25日
    00
  • 手把手教你jupyter notebook更换环境的方法

    以下是“手把手教你Jupyter Notebook更换环境的方法”的完整攻略。 写在前面 在开始更换Jupyter Notebook环境之前,我们需要认识到以下两个概念: 核(Kernel):Jupyter Notebook中的一个运行环境,它是一个与代码交互的程序实例,能够让我们在Notebook中编写、运行和编辑代码。 环境(Environment):一…

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