C语言( 动态内存分配)

news2024/11/30 0:28:07

目录

一.malloc()和free()(原型都在stdlib.h头文件)

1.malloc()

2.free()函数

3.案例演示

二.calloc()

三.realloc()

在在C语言的内存当中,针对不同的数据我们所存放的位置都是不一样的。内存栈区和静态区系统会自动创建和销毁,内存堆区由自己创建,释放。

区域

作用

内存栈区

存放局部变量名

内存堆区

动态分配的变量

静态区

用于存放全局变量或者静态变量,字符串常量

而如何实现对象的自动创建和释放,在这章当中我们将学习到。

一.malloc()和free()(原型都在stdlib.h头文件)

1.malloc()

malloc()参数,该函数接受一个参数(所需的内存字节数)。Malloc()函数会找到合适的空闲内存块,这样的内存是匿名的。所以,malloc()分配内存,但是不会为其赋名。它返回动态分配内存块的首字节地址。

因此,可以把该地址赋给一个指针变量,并使用指针访问这块内存。如果malloc()分配内存失败,则放回空指针。

malloc()返回一个void指针。该类型相当于“通用指针”。所以这种情况下直接就行

    double * ptd =  malloc(30 * sizeof(double));  

但一般情况下我们都会将返回类型进行类型进行强制转换,这样主要是为了提高代码的可读性。

    double * ptd;

    ptd = (double *) malloc(30 * sizeof(double));   分配30个double类型的空间,(double * )将类型强制转换为 double *

然后让ptd指向这个块的首元素,便可像使用数组名一样使用它

2.free()函数

free()函数的参数是之前malloc返回的地址(参数是一个指针),该函数释放之前malloc()分配的内存。

因此,动态分配内存的存储器从调用malloc()分配内存到调用free()释放内存为止

    double * ptd;

    ptd = (double *) malloc(30 * sizeof(double));   分配30个double类型的空间,(double * )将类型强制转换为 double *

    free(ptd)

3.案例演示

演示代码

#include <stdio.h>

#include <stdlib.h>

int main(){

    double * ptd;

    int max;

    int number;

    int i = 0;

    puts("what is the maximum number of type double entries?");

    if(scanf("%d",&max) != 1){      //输入max错误

        puts("Number not correctly entered -- bye.");

        exit(EXIT_FAILURE);     //退出程序代码

    }

    ptd = (double *) malloc(max * sizeof(double));      //为ptd分配内存

   

    if(ptd == NULL){        //ptd动态分配空间错误

        puts("Memory allocation failed.Goodbye.");

        exit(EXIT_FAILURE);

    }

    puts("Enter the values (q to quit):");

    while(i < max && scanf("%lf",&ptd[i]) == 1) ++i;    //给ptd的每个元素赋值

    printf("Here are your %d entries:\n",number = i);

    for(i = 0; i < number ;i++){

        printf("%7.2f",ptd[i]);     //打印各元素

        if(i % 7 == 6)  putchar('\n');  //每7个元素打印一行

    }

    if(i % 7 != 0) putchar('\n');   //最后一行继续打印\n,除非上一个循环中打印过

    puts("Done.");

    free(ptd);      //释放动态内存

    return 0;

}

这个程序,让用户输入要存储的数字个数,然后通过用户输入的数,程序通过malloc来创建合适的存储大小。这样做可以很好节省程序的消耗开支

二.calloc()

分配内存还可以使用calloc(),和malloc()类似。Calloc()函数接受两个无符号整数作为参数,第一个参数是所需的存储单元数量,第二个参数是存储单元的大小(以字节为单位)

    double * ptd;

    ptd = (double *) calloc(30 , sizeof(double));         //和ptd = (double *) malloc(30 * sizeof(double));类似

注意calloc()分配的内存空间在使用完以后也必须使用free()释放空间

这里要说下,程序把静态对象,自动对象和动态分配的对象存储在不同的区域

calloc和malloc的区别在于,calloc会把初始化的内存的所有位设置为0

三.realloc()

这个函数用于修改一个原先已经分配的内存块的大小。可缩小(内存块尾部的部分内存位置被拿掉),也可扩张

格式

realloc(指针,新的大小)

在这个例子中,我们将ch指针原本指定的地址大小从3个字节变为了4个字节。可以发现可以正常使用


好了朋友们我们今天的内容到这就结束了,今天的内容到这里就结束了,如果有啥不会的朋友记得论坛里面提问哈~

如果朋友你感觉文章的内容对你有帮助,可以点赞关注文章和专栏以及关注我哈,嘿嘿嘿我会定期更新文章的,谢谢朋友你的支持哈

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

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

相关文章

RA4M2开发(3)----读取ISL29035数据,并在OLED上显示,串口打印

概述 首先导入必要的库文件&#xff0c;包括I2C驱动和OLED驱动。在代码中配置I2C接口&#xff0c;并初始化I2C驱动。配置ISL29035传感器&#xff0c;包括配置传感器的工作模式和量程。使用I2C读取ISL29035传感器的数据&#xff0c;并将其存储在变量中。初始化OLED驱动&#xf…

【机器学习】第二章-模型评估与选择-西瓜书笔记

文章目录为什么要进行模型评估&#xff1f;- 选择模型与参数在何种数据集上对训练误差进行评估&#xff1f;- 训练集在何种数据集上对泛化误差进行评估&#xff1f;- 测试集如何划分测试集&#xff1f;1 留出法2 交叉验证法3 自助法模型选择和调参的区别&#xff1f;如何模型选…

Pytest学习笔记

Pytest学习笔记 1、介绍 1.1、单元测试 单元测试是指在软件开发当中&#xff0c;针对软件的最小单位&#xff08;函数&#xff0c;方法&#xff09;进行正确性的检查测试 1.2、单元测试框架 测试发现&#xff1a;从多个py文件里面去找到我们测试用例测试执行&#xff1a;按…

WebDAV之葫芦儿·派盘+网盘精灵

网盘精灵 支持WebDAV方式连接葫芦儿派盘。 推荐一款让您的iPhone、iPod、iPad 变成WebDav客户端的软件,支持从WebDav服务器连接葫芦儿派盘服务进行上传和下载件。 网盘精灵让您的iPhone、iPod、iPad 变成WebDav客户端。功能:WebDav操作、文件共享、本地文件管理

jstack排查cpu占用高[复习]

这样就可以看到占用CPU高的代码位置。 总结&#xff1a;就是先查到占用高的应用和具体的线程&#xff0c;然后根据线程到堆积信息查找即可。 不过堆栈信息非十进制&#xff0c;需提前把线程号转为十六进制。 这样就可以看到占用CPU高的代码位置。 总结&#xff1a;就是先查到…

JavaScript------面向对象

目录 一、面向对象编程&#xff08;OOP&#xff09; 基本概念 二、类 1、语法 2、通过类创建对象 3、类的属性 4、类的方法 5、构造函数 三、面向对象的三个特点 1、封装 如何确保数据的安全&#xff08;实现封装的方式&#xff09;&#xff1a; 2、继承 在子类中&a…

【LeetCode】每日一题(4)

目录 题目&#xff1a;1124. 表现良好的最长时间段 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 写在最后&#xff1a; 题目&#xff1a;1124. 表现良好的最长时间…

算法思想 - 回溯算法

Backtracking(回溯)属于 DFS, 本文主要介绍算法中Backtracking算法的思想。回溯算法实际上一个类似枚举的搜索尝试过程&#xff0c;主要是在搜索尝试过程中寻找问题的解&#xff0c;当发现已不满足求解条件时&#xff0c;就“回溯”返回&#xff0c;尝试别的路径。回溯法是一种…

ChatGPT 类 AI 软件供应链的安全及合规风险

AIGC将成为重要的软件供应链近日&#xff0c;OpenAI推出的ChatGPT通过强大的AIGC&#xff08;人工智能生产内容&#xff09;能力让不少人认为AI的颠覆性拐点即将到来&#xff0c;基于AI将带来全新的软件产品体验&#xff0c;而AI也将会成为未来软件供应链中非常重要的一环。在O…

【项目精选】基于WEB的仓库管理系统的设计与实现(论文+视频+源码)

点击下载源码 仓库物品的管理是与我们的日常生活息息相关的一个重大问题。随着我国经济飞速的发展&#xff0c;改革开放的不断深入&#xff0c;企业要想在激烈的市场竞争中立于不败之地&#xff0c;要想继续的发展与生存&#xff0c;没有现代化的管理方式与方法是万万不行的&am…

torch.nn.parameter 生成可更新的 tensor (requires_grad = True)

torch.nn.parameter 是 PyTorch 中的一种特殊类型的 tensor&#xff0c;它主要用于存储神经网络中的参数。这些参数可以被自动求导和被优化器自动更新。使用 torch.nn.Parameter 定义的tensor 会被自动添加到模型的参数列表中。 \quadtorch.nn.Parameter 是继承自 torch.Tensor…

vite+vue3搭建的工程热更新失效问题

前段时间开发新的项目&#xff0c;由于没有技术上的限制&#xff0c;所以选择了vitevue3ts来开发新的项目&#xff0c;一开始用vite来开发新项目过程挺顺利&#xff0c;确实比vue2webpack的项目高效些&#xff08;为什么选择vite&#xff09;,但是过了一段时间后&#xff0c;不…

android组件化

学习流程&#xff1a;1.开源最佳实践&#xff1a;Android平台页面路由框架ARouter-阿里云开发者社区 (aliyun.com)2.中文ARouter使用API&#xff1a;https://github.com/alibaba/ARouter/blob/master/README_CN.md3.看当前文档后面的代码4.这是通俗易懂的文章&#xff1a;https…

使用 Nodejs、Express、Postgres、Docker 在 JavaScript 中构建 CRUD Rest API

让我们在 JavaScript 中创建一个 CRUD rest API&#xff0c;使用&#xff1a;节点.js表达续集Postgres码头工人码头工人组成介绍这是我们将要创建的应用程序架构的架构&#xff1a;我们将为基本的 CRUD 操作创建 5 个端点&#xff1a;创造阅读全部读一个更新删除我们将使用以下…

【H.264】码流解析 annexb vs avcc

H264码流解析及NALUAVCC和ANNEXB 前者是FLV容器、mp4 常用的。后者 是实时传输使用,所以是TS 一类的标准。VLC显示AVC1就是AVCC AVCC格式 也叫AVC1格式,MPEG-4格式,字节对齐,因此也叫Byte-Stream Format。用于mp4/flv/mkv, VideoToolbox。 – Annex-B格式 也叫MPEG-2 trans…

微信公众号扫码授权登录思路

引言 上学期研究了一下微信登录相关内容&#xff0c;也写了两三篇笔记&#xff0c;但是最后实际登录流程没有写&#xff0c;主要因为感觉功能完成有所欠缺&#xff0c;一直也没有好的思路&#xff1b;这两天我又看了看官方文档&#xff0c;重新构思了一下微信公众号登录相关的…

操作系统综合实验

实验目的 加深对进程概念理解&#xff0c;进一步认识进程并发执行掌握Linux系统的进程创建和终止操作掌握文件系统调用及文件标准子例程的编程方法掌握Linux下终端图形编程方法&#xff0c;能编写基于文本的图形界面掌握proc文件系统的使用 相关知识 Linux C编程中的头文件 …

知识点整合

⭐面试 自我介绍&#xff08;优势岗位匹配度&#xff09; 为什么来我们公司&#xff08;对公司的了解&#xff09; 讲讲做的项目&#xff08;为什么这么做&#xff0c;思路和贡献&#xff09; 跨部门涉案的业务流程 我们跨部门涉案业务主要是本系统、配合物流系统和罚没系…

二战字节跳动成功上岸,准备了小半年,拿27k也算不上很高吧~

先说下我基本情况&#xff0c;本科不是计算机专业&#xff0c;现在是学通信&#xff0c;然后做图像处理&#xff0c;可能面试官看我不是科班出身没有问太多计算机相关的问题&#xff0c;因为第一次找工作&#xff0c;字节的游戏专场又是最早开始的&#xff0c;就投递了&#xf…

SpringMVC传值

实现步骤 先看后台代码如何获取前端传过来的数据&#xff0c;直接在方法的参数列表中添加RequestParam(xxx)&#xff0c;再在后面加上参数列表即可 不过这样的方式会出现一个问题&#xff1a;当前端页面没有提交相应的数据过来的时候&#xff0c;后台会出现异常&#xff0c;所…