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日

相关文章

  • 如何使用python自带IDLE的几种方法

    Python自带的IDLE (Integrated Development Environment)是一款Python编程语言的集成开发环境,提供了一个交互式的解释器和一个编辑器,让我们可以更加方便地编写、测试和调试Python代码。本文将介绍几种使用Python自带IDLE的方法。 打开Python自带IDLE 要使用Python自带IDLE,首先需要将P…

    人工智能概论 2023年5月24日
    00
  • Django利用cookie保存用户登录信息的简单实现方法

    下面是关于“Django利用cookie保存用户登录信息的简单实现方法”的完整攻略。 一、什么是cookie? cookie是web服务器在客户端(通常是浏览器)存储数据的一种方式。它是一小段文本,在web服务器和浏览器间交换,最终存储在浏览器中。在下一次该浏览器向web服务器发出请求时,这个cookie就会被发送给服务器。cookie通常用于存储web站点…

    人工智能概论 2023年5月25日
    00
  • JAVA代码实现MongoDB动态条件之分页查询

    下面是详细讲解 “JAVA代码实现MongoDB动态条件之分页查询” 的完整攻略。 问题描述 MongoDB是一个文档数据库,它支持强大的查询功能。在实际应用中,我们常常需要对MongoDB进行分页查询,并且还需要支持动态查询条件,比如根据关键字或者是查询时间范围进行过滤。 解决方案 Java开发者可以通过集成Jongo库来操作MongoDB数据库,其中Jo…

    人工智能概论 2023年5月25日
    00
  • 神盾加密解密教程(二)PHP 神盾解密

    接下来我将详细讲解神盾加密解密教程中的第二篇,即“PHP 神盾解密”的完整攻略。 神盾加密解密教程(二)PHP 神盾解密 神盾加密解密概述 在互联网上,为了防止代码被盗取,程序员们通常会采用加密的方式来保护自己的代码。神盾加密是一种比较常见的加密方式,在前一篇教程中已经进行了详细讲解。在神盾加密的基础上,我们可以使用相应的工具来对加密后的代码进行解密,以便于…

    人工智能概论 2023年5月25日
    00
  • linux系统安装Nginx Lua环境

    下面是详细讲解“linux系统安装Nginx Lua环境”的完整攻略: 1. 安装Nginx 1.1 安装依赖库 在安装Nginx之前,需要先安装一些必要的依赖库,包括以下内容: $ sudo apt-get update $ sudo apt-get install curl gnupg2 ca-certificates lsb-release 1.2 添…

    人工智能概览 2023年5月25日
    00
  • python3 使用OpenCV计算滑块拼图验证码缺口位置(场景示例)

    简要介绍OpenCV OpenCV是一款功能强大的开源计算机视觉库,它可以处理图像和视频数据,支持多种编程语言,在数字图像处理、计算机视觉和机器学习等领域都有广泛应用。 准备工作 使用Python3,需要先安装OpenCV和Requests库。 pip install opencv-python pip install requests 获取验证码图片和缺口…

    人工智能概览 2023年5月25日
    00
  • java动态代理(jdk与cglib)详细解析

    Java动态代理(JDK与CGLIB)详细解析 什么是动态代理 代理模式是一种非常常见的设计模式,其核心思想是为其他对象提供一个代理对象来控制对这个对象的访问。静态代理必须手动编写代理类,而动态代理则是在运行期动态生成代理类。 JDK动态代理 JDK动态代理是Java官方提供的动态代理实现方式,它是基于反射机制实现的。JDK动态代理需要实现Invocatio…

    人工智能概览 2023年5月25日
    00
  • Mac版Python3安装/升级的方式

    下面是Mac版Python3安装/升级的完整攻略: 1. 安装Homebrew Homebrew是Mac OS X上的一款软件包管理工具,它可以安装、更新和卸载各种软件包,包括Python3。我们可以在终端运行以下命令安装Homebrew: /usr/bin/ruby -e "$(curl -fsSL https://raw.githubuserc…

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