码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C语言——动态数组的创建和使用


    C语言文章更新目录

    C语言学习资源汇总,史上最全面总结,没有之一
    C/C++学习资源(百度云盘链接)
    计算机二级资料(过级专用)
    C语言学习路线(从入门到实战)
    编写C语言程序的7个步骤和编程机制
    C语言基础-第一个C程序
    C语言基础-简单程序分析
    VS2019编写简单的C程序示例
    简单示例,VS2019调试C语言程序
    C语言基础-基本算法
    C语言基础-数据类型
    C语言中的输入输出函数
    C语言流程控制语句
    C语言数组——一维数组
    C语言数组——二维数组
    C语言数组——字符数组
    C语言中常用的6个字符串处理函数
    精心收集了60个C语言项目源码,分享给大家
    C语言核心技术——函数
    C代码是怎样跑起来的?
    C语言实现字符串的加密和解密
    C语言——文件的基本操作
    使用C语言链表创建学生信息并且将信息打印输出
    图解C语言冒泡排序算法,含代码分析
    实例分析C语言中strlen和sizeof的区别
    开发C语言的3款神器,VS2019、VScode和IntelliJ Clion
    动图图解C语言选择排序算法,含代码分析
    动图图解C语言插入排序算法,含代码分析
    C语言指针数组和数组指针详解
    5分钟搞懂C语言中的传值和传址

    C语言实例专栏(持续更新中…)

    什么是动态数组?

    动态数组是相对于静态数组而言的,从“动”字可以看出它的灵活性。静态数组的长度是预先定义好的,在整个程序中,一旦给定数组大小后就无法改变。而动态数组则不然,它可以根据程序需要重新指定数组大小。动态数组的内存空间是由堆动态分配的,通过执行代码为其分配存储空间,只有程序执行到分配语句时,才为其分配存储空间。

    动态数组和一般数组(静态数组)的区别

    • 静态数组:创建非常方便,使用完也无需释放,引用起来也简单,但是创建后无法改变数组大小是其致命的弱点。
    • 动态数组:创建麻烦,使用完必须由程序员自己释放,否则会引起内存泄露,但是其使用非常灵活,能根据程序需要动态分配大小。

    动态数组的创建和使用

    在创建动态数组的过程中要遵循一个原则,那就是从外层向里层逐层创建,从里层向外层逐层释放。如果要创建一个N维的动态数组,那么要从第一维开始创建,直到第N维为止;而释放时与创建时相反,即从第N维开始释放,直到第一维为止。下面我们一起来看看一维动态数组和二维动态数组。

    一维动态数组

    • 创建形式

    类型说明符* 数组名 = (类型说明符*)malloc(数组长度*sizeof(类型说明符))

    • 实例
    //
    // Created by 冲哥 on 2022/11/26.
    // 微信关注【C语言中文社区】,免费领取500G学习资料
    //
    #include
    #include
    
    int main() {
        int n; //用来接收要创建的一维动态数组的长度
        int *arr;
        printf("请输入所要创建的一维动态数组的长度:");
        scanf("%d", &n);
        if ((arr = (int *) malloc(sizeof(int) * n)) == NULL) { //使用malloc来动态分配内存
            printf("分配内存空间失败!\n");//如果内存分配失败,报错异常退出
            return -1;
        }
        for (int i = 0; i < n; i++) { //通过循环给数组赋值并在控制台进行打印
            arr[i] = i + 1;
            printf("%d\t", arr[i]);
        }
        free(arr); //释放内存空间
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 运行结果
    请输入所要创建的一维动态数组的长度:8
    1    2       3       4       5       6       7       8
    
    • 1
    • 2

    二维动态数组

    • 创建形式
    类型说明符** 数组名 = (类型说明符**)malloc(第一维长度*sizeof(类型说明符*))
    for(int  i=0;i<第一维长度;i++){
        数组名[i]=(类型说明符*)malloc(第二维长度*sizeof(类型说明符))
    }
    
    • 1
    • 2
    • 3
    • 4
    • 实例
    //
    // Created by 冲哥 on 2022/11/26.
    // 微信关注【C语言中文社区】,免费领取500G学习资料
    //
    #include
    #include
    
    int main() {
        int n1, n2;
        int **arr;
        printf("请输入所要创建的动态数组的第一维长度:");
        scanf("%d", &n1);
        printf("请输入所要创建的动态数组的第二维长度:");
        scanf("%d", &n2);
    
        if ((arr = (int **) malloc(n1 * sizeof(int *))) == NULL)//使用malloc给第一维分配内存
        {
            printf("分配内存空间失败!\n");//如果内存分配失败,报错异常退出
            return -1;
        }
    
        for (int i = 0; i < n1; i++) {
            if ((arr[i] = (int *) malloc(n2 * sizeof(int))) == NULL)//使用malloc给第二维分配内存
            {
                printf("分配内存空间失败!\n");//如果内存分配失败,报错异常退出
                return -1;
            }
        }
        for (int i = 0; i < n1; i++) { //通过循环给数组赋值并在控制台进行打印
            for (int j = 0; j < n2; j++) {
                arr[i][j] = i * n2 + j + 1;
                printf("%d\t", arr[i][j]);
            }
            printf("\n");
        }
        for (int i = 0; i < n1; i++) {
            free(arr[i]);//释放第二维
        }
        free(arr);//释放第一维
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 运行结果
    请输入所要创建的动态数组的第一维长度:5
    请输入所要创建的动态数组的第二维长度:4
    1       2       3       4
    5       6       7       8
    9       10      11      12
    13      14      15      16
    17      18      19      20
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    代码中的注释已经写的很详细了,如果还有什么疑问欢迎评论区留言。
    如果您觉得本篇文章对您有帮助,请点赞,转发给更多的人。

  • 相关阅读:
    Redis可以干什么
    SQL基础语句入门
    Linux操作系统使用及C高级编程-D6-D8Linux shell脚本
    【MyBatis-Plus】DQL
    4518. 最低票价
    1688阿里巴巴中国站电商数据官方平台API接口按图搜索1688商品(拍立淘)响应示例说明
    <爬虫部署,进阶Docker>----第一章 介绍Docker
    Linux:Mac VMware Fusion13以及CentOS7安装包
    杠杆思维和时间管理
    集合贴3——智能客服系统
  • 原文地址:https://blog.csdn.net/csdn_wangchong/article/details/128053909
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号