首页 > 系统相关 >【C语言入门】如何使用动态内存分配来模拟“大小未知”的数组

【C语言入门】如何使用动态内存分配来模拟“大小未知”的数组

时间:2024-08-21 16:23:25浏览次数:12  
标签:入门 int realloc C语言 内存 数组 动态内存 大小 array

如何使用动态内存分配来模拟“大小未知”的数组

引子

在C语言中,定义一个“大小未知”的数组直接是不可行的,因为数组在声明时必须有确定的大小,要么是在编译时确定的常量表达式,要么是在C99更高标准下,允许运行时确定大小的变长数组(VLA)

变长数组(Variable Length Array,简称VLA)是C99标准引入的一个特性,允许在函数的局部作用域中定义数组,其大小可以在运行时确定。变长数组的大小必须是一个非负整数表达式,并且在数组的生命周期内不能改变。

但是,如果你想要处理大小未知或动态变化的数据集,可以使用动态内存分配来模拟“大小未知”的数组。这通常通过使用malloccallocreallocfree函数来实现。

函数用途
malloc内存分配
calloc分配并清零
realloc重新分配

举例应用

下面是一个使用mallocrealloc来创建和扩展数组的示例:

#include <stdio.h>
#include <stdlib.h>

int main() 
{
    int *array;
    int size = 0; // 初始大小为0
    int capacity = 5; // 起始分配容量
    int newElement;

    // 动态分配内存
    array = (int *)malloc(capacity * sizeof(int));
    if (array == NULL) 
    {
        fprintf(stderr, "Memory allocation failed!\n");
        return 1;
    }

    // 扩展和使用数组
    while (1) 
    {
        printf("请输入一个整数(输入-1结束):");
        scanf("%d", &newElement);
        if (newElement == -1) break;

        // 检查是否需要增加数组容量
        if (size == capacity) 
        {
            capacity *= 2; // 增加一倍容量
            array = (int *)realloc(array, capacity * sizeof(int));
            if (array == NULL)
             {
                fprintf(stderr, "Memory reallocation failed!\n");
                return 1;
            }
        }

        array[size++] = newElement; // 添加新元素
    }

    // 打印数组
    printf("数组中的元素:\n");
    for (int i = 0; i < size; i++)
    {
        printf("%d ", array[i]);
    }
    printf("\n");

    // 释放内存
    free(array);

    return 0;
}

在这个例子中,我们使用了malloc来初始化数组的内存,并使用realloc来动态扩展数组的大小。当数组满时,realloc会尝试分配更多的内存,并将现有数据复制到新的内存空间。当程序结束时,使用free来释放分配的内存。

结语

这种方法虽然可以实现“大小未知”的数组,但需要手动管理内存的分配和释放,以避免内存泄漏和程序异常。此外,使用realloc可能会导致数据重新拷贝,可能影响性能。

标签:入门,int,realloc,C语言,内存,数组,动态内存,大小,array
From: https://blog.csdn.net/2401_86679036/article/details/141393248

相关文章

  • Docker快速入门 01 安装、部署环境
    1.简介和安装1.1简介Docker是一个应用打包、分发、部署的工具。打包:需要的环境变成一个“安装包”。分发:将“安装包”上传到云端,供他人获取。部署:将“安装包”下载下来后直接快速搭建运行环境。通俗讲就是轻量级的虚拟机,只虚拟需要的运行环境。1.2安装这里以Docker......
  • Docker快速入门 02 构建镜像
    本文以PythonWeb(Flask)小项目构建Docker镜像1.准备项目确保PythonWeb项目已准备好项目目录结构my-python-app/│├──app.py├──requirements.txt└──Dockerfileapp.py:Flask应用的主文件。fromflaskimportFlaskapp=Flask(__name__)@app.ro......
  • C语言编译预处理详细易懂版
    C语言允许在源程序中包含编译预处理命令,他们以"#"开头,包括宏定义、文件包含和条件编译。本博客主要详细介绍宏定义、文件包含和条件编译。一、宏定义1、无参数的宏定义是指用一个指定的标识符来代表一个字符串,一般格式如下:#define 宏名 字符串说明:①#表示预处理命......
  • C语言文件操作详细易懂版
     本期博客将介绍在C语言中进行文件操作的常见函数和基本方法,包括文件的基本概念、文件的打开和关闭、文件的读写操作、文件定位、文件检测等内容。目录一、文件的概念二、文件的分类1.文本文件:2.二进制文件:三、文件类型指针四、文件的打开操作五、文件的关闭操作六......
  • VUEX基础入门Store使用详解
    【1】vuex是什么github站点:https://github.com/vuejs/vuex,在线文档:https://vuex.vuejs.org/zh-cn/Vuex是一个专为Vue.js应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。每一个Vuex应用的......
  • DevOps入门(上)
    1:DevOps概念DevOps:Development和Operations的组合DevOps看作开发(软件工程)、技术运营和质量保障(QA)三者的交集。突出重视软件开发人员和运维人员的沟通合作,通过自动化流程来使得软件构建、测试、发布更加快捷、频繁和可靠。DevOps希望做到的是软件产品交付过程中......
  • 豆瓣评分8.7!Python pandas创始人亲码的数据分析入门手册!
    在众多解释型语言中,Python最大的特点是拥有一个巨大而活跃的科学计算社区。进入21世纪以来,在行业应用和学术研究中采用python进行科学计算的势头越来越猛。近年来,由于Python有不断改良的库(主要是pandas),使其成为数据处理任务的一大代替方案,结合其在通用编程方面的强大实力,完......
  • 零基础测试入门记录(一)
    1.测试的流程:第一步需求评审:就是前端、后端、产品、测试开个会议。确保大家对于即将开发的模块的需求理解一致,有问题就提出来。第二步写测试计划:测试组长来写。说明:指导测试执行的文档(重要)测什么(目标、范围)谁来测(人员进度及安排)怎么测(测试工具、测试策略)第......
  • 车载以太网交换机入门基本功(3)—VLAN 转发
        在《车载以太网交换机入门基本功(2)》中提到,报文通过携带Tag字段,表明报文所属的VLAN。本文将介绍携带Tag报文在VLAN下的转发过程。而在实际转发过程中,交换机的端口属性起到关键作用。交换机端口属性    交换机的端口属性包括三大属性:VID、PVID、Tag/Untag。VI......
  • 网安入门—信息收集
    1.定义信息收集是指收集有关目标应用程序和系统的相关信息。这些信息可以帮助攻击者了解目标系统的架构、技术实现细节、运行环境、网络拓扑结构、安全措施等方面的信息,以便我们在后续的渗透过程更好的进行。2.分类主动信息收集和被动信息收集区别:(1)收集方式不同主动信息......