C语言学习(三十三)---动态内存(二)

news2024/11/24 17:52:52

在上一节的内容中,我们初步学习了有关动态内存的有关内容,但是在使用上实际上还有很多的细节问题,今天我们将继续对该部分的内容进行学习,好了,话不多说,开整!!!

动态内存使用前的准备

在上一节的内容中,我们在向栈区申请完空间之后,就直接进行了空间的使用,但是显然我们忽略了一个问题:那就是内存中的栈区还有这么大的地方给你吗
因此,

在申请完后见之后,我们要判断是否申请成功,然后再进行使用

如何判断向栈区空间申请是否成功呢,很简单,如果没有申请成功,那么他肯定就会还给我一个空指针,因此,只需判定返回的指针是否为空即可

在不为空的情况下进行使用,如果为空,我们打印错误信息打印错误信息的函数为strerror
代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    int* p = (int*)malloc(5*sizeof(int));
    int i = 0;
    if(p == NULL)
    {
        printf("%s",strerror(errno));
    }
    else
    {
    for(i=0;i<5;i++)
    {
        *(p+i) = i;
        printf("%d ",*(p+i));
    }
    }
    return 0;
}

这样就比较严谨了,但仍没有达到最严谨的地步

动态内存的释放

为什么在上述内容说代码还是不是特别严谨呢,你想:我们向内存中申请了空间,咋你不还给人家换回去了????

俗话说:有借有还,再借不难,因此,我们在使用后,需要对申请的内存进行释放,释放也很简单,使用函数free即可,在释放完成后再将其置空,则完美了。
为什么要置空呢,因为如果不置空,只是单纯的释放该指针,该指针会扔指向该地址
代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    int* p = (int*)malloc(5*sizeof(int));
    int i = 0;
    if(p == NULL)
    {
        printf("%s",strerror(errno));
    }
    else
    {
    for(i=0;i<5;i++)
    {
        *(p+i) = i;
        printf("%d ",*(p+i));
    }
    }
    free(p);
    return 0;
}

调试查看结果:
未释放内存前:
在这里插入图片描述
释放内存后:
在这里插入图片描述
而在置空之后在free后加入p = NULL,才真正将该指针销毁
在这里插入图片描述

总结

因此,在动态内存使用时应该注意:

1、使用前判断是否申请成功
2、使用后,释放该指针指向的内存空间

那么上述程序最为规范严谨的代码应该为:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    int* p = (int*)malloc(5*sizeof(int));
    int i = 0;
    if(p == NULL)
    {
        printf("%s",strerror(errno));
    }
    else
    {
    for(i=0;i<5;i++)
    {
        *(p+i) = i;
        printf("%d ",*(p+i));
    }
    }
    free(p);
    p = NULL;
    return 0;
}

上述内容即使今天的全部内容了,感谢大家的观看。
如果方便,辛苦大家点个赞和关注哦!
您的点赞或评论或关注是对我最大的肯定,谢谢大家!!!

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

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

相关文章

第一章 Android 基础--开发环境搭建

文章目录 1.Android 发展历程2.Android 开发机器配置要求3.Android Studio与SDK下载安装4.创建工程与创建模拟器5.观察App运行日志6.环境安装可能会遇到的问题7.练习题 本专栏主要在B站学习视频&#xff1a; B站Android视频链接 本视频范围&#xff1a;P1—P8 1.Android 发展历…

【机器学习核心总结】什么是KNN( K近邻算法)

什么是KNN( K近邻算法) 虽然名字中有NN&#xff0c;KNN并不是哪种神经网络&#xff0c;它全名K-Nearest-Neighbors&#xff1a;K近邻算法&#xff0c;是机器学习中常用的分类算法。 物以类聚&#xff0c;人以群分。KNN的基础思想很简单&#xff0c;要判断一个新数据的类别&…

AI最新开源:LMSYS Org开源LongChat、法律大语言模型ChatLaw、中文医疗对话模型扁鹊

一周SOTA&#xff1a;LMSYS Org开源LongChat、法律大语言模型ChatLaw、中文医疗对话模型扁鹊 文章目录 1. LMSYS Org发布LongChat&#xff0c;上下文碾压64K开源模型2. 北大团队发布法律大模型 ChatLaw3. 扁鹊&#xff1a;指令与多轮问询对话联合微调的医疗对话大模型 1. LMSY…

Linux 内核源代码情景分析(四)

系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核 Linux 设备驱动程序 Linux设备驱动开发详解 深入理解Linux虚拟内存管理 Linux 内核源代码情景分析&#xff08;一&#xff09; Linux 内核源代码情景分析&#xff08;二&#xff09; Linux 内核源代码情景分析&#xff…

开源项目推荐 【SkyEyeSystem】

大家好&#xff0c;今天向大家推荐一个开源项目——SkyEyeSystem。 这是一个基于Spring Boot的全网热点爬虫项目&#xff0c;旨在提供全面而准确的全网热搜数据。 关于项目 SkyEyeSystem通过定时任务间隔10min爬取全网热搜数据。目前包括的平台有&#xff1a; 微博热搜B站热…

Huawei Cloud EulerOS 安装 MySQL8.0

EulerOS 安装 MySQL8.0 安装MySQL配置文件 安装MySQL 当创建一个基于EulerOS的服务器时&#xff0c;MySQL是一个常见且强大的数据库管理系统选择。在此博客中&#xff0c;我将向您展示如何在EulerOS上安装MySQL 8.0。 步骤1&#xff1a;更新系统 在开始之前&#xff0c;让我…

【FATE】联邦学习 optimizer在FATE的自定义trainer中被改变

起因 使用torch的optimizer添加了2组parameter&#xff0c;传参进入FATE的trainer后&#xff0c;optimizer被改变&#xff0c;且FATE框架无提示。 代码差不多是下面这样&#xff1a; # optimizer中加入2组优化参数&#xff08;param&#xff09; optimizer torch.optim.SGD…

滑动窗口 /【模板】单调队列

day1 滑动窗口 /【模板】单调队列 题目描述 有一个长为 n n n 的序列 a a a&#xff0c;以及一个大小为 k k k 的窗口。现在这个从左边开始向右滑动&#xff0c;每次滑动一个单位&#xff0c;求出每次滑动后窗口中的最大值和最小值。 例如&#xff1a; The array is [ …

mysql redis区别

一、.redis和mysql的区别总结 &#xff08;1&#xff09;类型上 从类型上来说&#xff0c;mysql是关系型数据库&#xff0c;redis是缓存数据库 &#xff08;2&#xff09;作用上 mysql用于持久化的存储数据到硬盘&#xff0c;功能强大&#xff0c;但是速度较慢 redis用于存储使…

NSS [NSSCTF 2022 Spring Recruit]ezgame

NSS [NSSCTF 2022 Spring Recruit]ezgame 前端小游戏&#xff0c;乐。

【雕爷学编程】Arduino动手做(136)---0.91寸OLED液晶屏模块3

0.91寸OLED模块引脚说明 GND ------ 地线 VCC ------ 电源 &#xff08;因为模块内部自带稳压&#xff0c;所以3.3~5V供电都是ok的&#xff09; SDA ------ I2C 数据线&#xff08;接A4&#xff09; SCL ------ I2C 时钟线&#xff08;接A5&#xff09; &#xff08;可以…

Pairwise 提高测试造数据的困难

Pairwise是L. L. Thurstone(29 May1887 – 30 September 1955)在1927年首先提出来的。他是美国的一位心理统计学家。Pairwise也正是基于数学统计和对传统的正交分析法进行优化后得到的产物。 下图是另一个项目结构 (造一个csv转测试用例) selenium的挑战者 - playwright简析 搭…

代码随想录二刷day44 | 动态规划之 完全背包 518. 零钱兑换 II 377. 组合总和 Ⅳ

day44 完全背包基础知识问题描述举个栗子 518. 零钱兑换 II1.确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组 377. 组合总和 Ⅳ1.确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例来推导dp数组 完全背…

Android之OkHttp框架的分析

Okhttp是Android开发常用的一个网络请求框架&#xff0c;下面将按照自己的理解将okhttp分为三条主线进行分析。 文章目录 使用方式OkHttp第一条主线&#xff1a;请求发送到哪里去了&#xff1f;OkHttp第二条主线&#xff1a;请求是如何被消费的&#xff1f;OkHttp第三条主线&a…

376. 摆动序列

如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为 摆动序列 。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 例如&#xff0c; [1, 7, 4, 9, 2, 5] 是一个 摆动序列 &…

机器学习 day24(多类分类模型)

多类分类 多类分类问题仍然是分类问题&#xff0c;所以预测y的可能结果是少量的&#xff0c;而不是无穷多个&#xff0c;且对于多类分类它&#xff1e;2 如上图&#xff1a;左侧为二分类&#xff0c;右侧为多分类&#xff0c;可以通过决策边界来划分区域

EasyExcel导出横向动态表头

需求&#xff1a;导出如下所示excel文档&#xff0c;红框内为动态表头 mysql表内数据格式如下图所示&#xff0c;由于某些特殊原因不能横向展示&#xff0c;仅能纵向展示&#xff0c;所以一个vin对应的数据可能有很多此时导出的时候上图所示的样式更便于人员观看。 依赖项 <…

VS多处理器编译提高编译速度

VS多处理器编译提高编译速度 开启多处理器编译能够提升编译速度&#xff0c;特别是当工程巨大时候&#xff0c;编译速度往往很慢&#xff0c;打开多处理器编译效果明显&#xff0c;下面给出设置和对比 开启多处理器编译 关闭多处理器编译

RabbitMQ系列(8)--实现RabbitMQ队列持久化及消息持久化

概念&#xff1a;在上一章文章中我们演示了消费者宕机的情况下消息没有被消费成功后会重新入队&#xff0c;然后再被消费&#xff0c;但如何保障RabbitMQ服务停掉的情况下&#xff0c;生产者发过来的消息不会丢失&#xff0c;这时候我们为了消息不会丢失就需要将队列和消息都标…

提高计算能力的五种方法

一旦你投入时间&#xff0c;就会 不舍得 轻易放手。 一开始可能会很浪费时间&#xff0c;但是当你练熟之后&#xff0c;效果显而易见。 二次函数&#xff1a;