【重拾C语言】十三、动态数据组织(一)动态变量(malloc、calloc、realloc、free)

news2024/11/19 16:25:21

目录

前言

十三、动态数据组织

13.1 动态数据组织

13.2 动态变量

malloc函数

calloc函数

realloc函数

free函数

程序实例


前言

        C语言中的动态数据组织是指在程序运行时根据需要动态地分配内存空间来存储数据。这允许程序在运行时根据实际需求来创建、修改和释放数据结构,而不是在编译时固定地分配内存。

十三、动态数据组织

13.1 动态数据组织

        C语言是一种通用的编程语言,它提供了一些基本的数据结构和静态数组来存储和组织数据。然而,C语言本身并没有提供内置的动态数据结构,如动态数组或链表。要实现动态数据组织,通常需要手动编写代码来管理内存分配和释放。在C语言中,可以使用指针和动态内存分配函数来实现动态数据结构

  • 动态内存分配函数包括malloc、calloc和realloc
    • malloc函数用于分配指定大小的内存空间
    • calloc函数用于分配指定数量和大小的内存空间并将其初始化为零
    • realloc函数用于重新分配已分配内存的大小

        使用动态内存分配函数,可以创建动态数组。动态数组的大小可以在运行时根据需要进行调整,而不需要预先指定固定的大小。通过动态内存分配函数,可以根据实际需求动态地增加或减少数组的大小。

        此外,通过使用指针和相关的数据结构,如链表,也可以实现动态数据组织。链表是一种由节点组成的数据结构,每个节点包含数据和指向下一个节点的指针。通过适当的操作,可以在运行时插入、删除和修改链表中的元素。

指针相关知识,参考前文:

【重拾C语言】七、指针(一)指针与变量、指针操作、指向指针的指针-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_63834988/article/details/133690334?spm=1001.2014.3001.5501【重拾C语言】七、指针(二)指针与数组(用指针标识数组、多维数组与指针、数组指针与指针数组)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_63834988/article/details/133753904?spm=1001.2014.3001.5501【重拾C语言】七、指针(三)指针与字符串(字符串与字符串数组;指针与字符串的遍历、拷贝、比较;反转字符串)_QomolangmaH的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_63834988/article/details/133755405?spm=1001.2014.3001.5501

13.2 动态变量

        动态变量是指在程序运行时动态分配内存的变量。在C语言中,可以使用动态内存分配函数malloccallocrealloc来创建动态变量。下面简要介绍这些函数的作用:

  • malloc函数

    • 用于分配指定字节数的内存空间,并返回一个指向该内存空间的指针。语法如下:
void* malloc(size_t size);

        `size`参数是要分配的字节数。要动态分配一个`int`类型的变量,可以使用以下代码:

int* dynamicVariable = (int*)malloc(sizeof(int));

        这里的`sizeof(int)`用于获取`int`类型变量所占的字节数,然后`malloc`函数根据这个大小分配相应的内存空间。

  • 注意:
    • `malloc`函数返回的指针类型是`void*`,需要进行类型转换才能赋值给其他类型的指针
    • `malloc`函数只分配内存空间,并不对其进行初始化

  • calloc函数

    • 用于分配指定数量和大小的连续内存空间,并返回一个指向该内存空间的指针。与malloc不同的是,calloc函数会将分配的内存空间清零,即将所有位都设置为0。语法如下:
void* calloc(size_t num, size_t size);

        这里的`num`参数是要分配的元素数量,`size`参数是每个元素的大小。要动态分配一个包含5个`double`类型元素的数组:

double* dynamicArray = (double*)calloc(5, sizeof(double));

  • realloc函数

    • 用于重新分配已经分配的内存空间的大小。通常在需要修改动态变量的大小时使用该函数。语法如下:
void* realloc(void* ptr, size_t size);

        这里的`ptr`参数是指向要重新分配的内存空间的指针,`size`参数是重新分配后的新大小。要将先前分配的动态数组增加到10个元素:

dynamicArray = (double*)realloc(dynamicArray, 10 * sizeof(double)); 

        `realloc`函数会根据新的大小重新分配内存空间,并返回一个指向重新分配后内存空间的指针。需要注意的是,如果重新分配失败,`realloc`函数会返回`NULL`,这时需要处理错误情况。

  • free函数

    • 使用上述动态内存分配函数,可以创建动态变量,使程序能够根据需要动态地管理内存,从而更灵活地处理数据。在使用完动态变量后,应使用free函数来释放已分配的内存空间,以便系统可以重新利用这些空间:
void free(void* ptr);

       动态变量的管理是程序员的责任,必须确保在不再需要动态变量时及时释放其对应的内存空间,以避免内存泄漏和资源浪费的问题。

        释放先前分配的动态变量:

free(dynamicVariable);

程序实例

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

int main() {
    int numElements;

    printf("Enter the number of elements: ");
    scanf("%d", &numElements);

    // 动态分配整型数组的内存空间
    int* dynamicArray = (int*)malloc(numElements * sizeof(int));
    if (dynamicArray == NULL) {
        printf("Memory allocation failed.\n");
        return 1;
    }

    // 输入数组元素
    printf("Enter %d elements:\n", numElements);
    for (int i = 0; i < numElements; i++) {
        scanf("%d", &dynamicArray[i]);
    }

    // 输出数组元素
    printf("Array elements: ");
    for (int i = 0; i < numElements; i++) {
        printf("%d ", dynamicArray[i]);
    }
    printf("\n");

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

    return 0;
}

        首先输入要创建的动态数组的元素数量,然后使用malloc函数分配足够的内存空间来存储这些元素,每个元素的大小为sizeof(int)。如果内存分配失败,程序会输出相应的错误信息并返回。接下来,需要逐个输入数组的元素值。最后,程序会输出数组的元素值,并使用free函数释放动态分配的内存空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1095064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数字IC设计】VCS门级网表仿真

本文参考自文章。 除了RTL仿真以外&#xff0c;在IC设计过程中还会进行门级网表的仿真。当设计代码功能仿真通过之后&#xff0c;我们便使用Design Compiler工具对其进行逻辑综合&#xff0c;将RTL代码转化为由与、或、非等门电路和触发器组成的电路&#xff0c;称为门级网表(n…

25栈和队列-理解栈和队列

目录 LeetCode之路——232. 用栈实现队列 分析&#xff1a; LeetCode之路——225. 用队列实现栈 分析&#xff1a; 栈&#xff08;Stack&#xff09;和队列&#xff08;Queue&#xff09;是两种基本的数据结构&#xff0c;它们在计算机科学中用于不同的目的。以下是它们的定…

【传输层协议】UDP/TCP结构特点与原理(详解)

文章目录 1. UDP1.1 UDP结构1.2 UDP特点1. 无连接2. 不可靠3. 面向数据报4. 缓冲区5. 大小受限6. 无序性 2. TCP2.1 TCP结构2.2 TCP特点1. 有连接2. 可靠性3. 面向字节流4. 拥塞控制5. 头部开销 2.3 TCP原理1. 确认应答&#xff08;安全机制&#xff09;2. 超时重传&#xff08…

Ceph分布式存储的简单介绍与Ceph集群的部署搭建

文章目录 1. 存储的概述1.1 单机存储设备1.1.1 DAS&#xff08;直接附加存储&#xff09;1.1.2 NAS&#xff08;网络附加存储&#xff09;1.1.3 SAN&#xff08;存储区域网络&#xff09; 1.2 单机存储的缺陷1.3 分布式存储&#xff08;软件定义的存储 SDS&#xff09;1.4 分布…

【计算机网络笔记】数据交换之报文交换和分组交换

系列文章目录报文交换分组交换存储-转发报文交换 vs 分组交换总结 系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 报文交换 报文&#xff1a;源&#xff08;应用&#xff09;发送的信息整体。比如一个文件、一…

Transformer 中 Positional Encoding 实现

参考博文&#xff1a; https://www.cnblogs.com/nickchen121/p/16470736.html 解决问题 位置编码的主要目的是确保模型能够理解序列中的元素之间的相对位置和顺序&#xff0c;从而更好地捕捉到语义信息。在Transformer模型中&#xff0c;位置编码通常与词嵌入&#xff08;w…

前端小知识之【浏览器内核】

目录 &#x1f31f;前言&#x1f31f;PC端浏览器内核&#x1f31f;Trident内核&#x1f31f;Gecko内核&#x1f31f;WebKit内核(Chromium)&#x1f31f;Blink内核 &#x1f31f;移动端浏览器内核&#x1f31f;应用&#x1f31f;写在最后 &#x1f31f;前言 通常所谓的浏览器内…

docker安装nessus

注册地址:https://zh-tw.tenable.com/products/nessus/nessus-essentials 临时邮箱:http://24mail.chacuo.net/ 帮助文档:https://docs.tenable.com/nessus/Content/DeployNessusDocker.htmdocker pull tenableofficial/nessusdocker run --name "my-nessus" -d -p 8…

【Go入门】编程语言比较:Golang VS Python

Golang&#xff1a;最佳人工智能语言&#xff0c;性能优于 Python 本节是学习go的引入&#xff0c;为了了解Python与go编程语言间比较。后续会完成相关课程&#xff0c;并分享笔记。 如今&#xff0c;世界各地有数百万用户使用 Golang 作为机器学习和人工智能的编程语言。 最好…

算法通过村第十四关-堆|白银笔记|经典问题

文章目录 前言在数组中寻找第K大的元素堆排序原理合并K个排序链表总结 前言 提示&#xff1a;想要从讨厌的地方飞出来&#xff0c;就得有藏起来的翅膀。 --三岛由纪夫《萨德侯爵夫人》 这里我们主要看一下经典的题目&#xff0c;这三个题目来说都是堆的热点问题。重点再理解处理…

Qt不能安装自己想要的版本,如Qt 5.15.2

使用在线安装工具安装Qt5.15.2时&#xff0c;发现没有Qt 5的相关版本&#xff0c;只有Qt 6的版本&#xff0c;这时选择右边的Archive&#xff0c;再点击筛选&#xff0c;这时就会出现之前的Qt版本。

vscode插件路径转移C盘之外盘

改变vscode系统路径 最近C盘路径不够了&#xff0c;网上的工具使用没那么精细&#xff0c;还不如自己手动看每个文件夹大小。在整理过长遇到vscode插件路径转移&#xff0c;方法如下&#xff1a; 桌面图标右键点击属性 改变–extensions-dir后面参数就可以了。

Web3 整理React项目 导入Web3 并获取区块链信息

上文 WEB3 创建React前端Dapp环境并整合solidity项目&#xff0c;融合项目结构便捷前端拿取合约 Abi 我们用react 创建了一个 dapp 项目 并将前后端代码做了个整合 那么 我们就来好好整理一下 我们的前端react的项目结构 我们在 src 目录下创建一个 components 用来存放我们的…

Python学习----Day07

函数 函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现单一&#xff0c;或相关联功能的代码段。函数能提高应用的模块性&#xff0c;和代码的重复利用率。你已经知道Python提供了许多内建函数&#xff0c;比如print()。但你也可以自己创建函数&#xff0c;这被叫做…

C++ 程序员入门需要多久,怎样才能学好?

文章目录 C学习方案有哪些推荐的在线教程或学习资源可以帮助我学习C编程&#xff1f;你能给我一些关于C内存管理的进阶学习资源吗&#xff1f; AI解答 C学习方案 C是一种功能强大且广泛应用的编程语言&#xff0c;作为一个初学者&#xff0c;学习C需要一定的时间和努力。学习…

【java学习—七】对象的实例化过程(33)

文章目录 1. 简单类对象的实例化过程2. 子类对象的实例化过程 1. 简单类对象的实例化过程 2. 子类对象的实例化过程

YOLO目标检测——打电话数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;安全监控、智能驾驶、人机交互、智能城市数据集说明&#xff1a;YOLO目标检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富。使用lableimg标注软件标注&#xff0c;标注框质量高&#xff0c;含voc(xml)、coco(json)和yolo(txt…

快速学习MyBatisPlus

文章目录 前言一、条件构造器和常用接口1.wapper介绍2.QueryWrapper&#xff08;1&#xff09;组装查询条件&#xff08;2&#xff09;组装排序查询&#xff08;3&#xff09;组装删除查询&#xff08;4&#xff09;条件优先级&#xff08;5&#xff09;组装select子句&#xf…

c++命名空间,缺省参数,引用

首先为了解决命名冲突&#xff0c;c提出了命名空间这一功能 比如using namespace std; 就是使用std&#xff08;c官方库定义的命名空间&#xff09;这个命名空间里面的命名。 using就可以直接指定本文件用那个命名空间。 也可以用::域作用限定符 如std::cin>> 并且会…

Linux网络编程系列之服务器编程——信号驱动模型

一、什么是信号驱动模型 在服务器中&#xff0c;信号驱动模型是一种事件处理模型&#xff0c;它能够异步地响应来自外部的事件。服务器可以注册一组回调函数&#xff0c;来处理来自客户端或其他进程的信号或事件&#xff0c;当信号或事件触发时&#xff0c;操作系统会通知服务器…