C语言学习(三十四)---动态内存常见错误总结

news2024/10/6 5:31:32

上节内容中,我们学习如何规范的申请和使用动态内存,其实是很重要的一环。

在大的程序中,应该注意这些细节问题,不然就会对其他的程序猿们产生影响,因为大的程序不可能交由一个人完成,所以,你编写的代码不够规范就有可能对后续的编写工作产生不良的影响。

今天,我们将学习在动态内存中常见的错误,好了,话不多说,开整!!!!!

动态内存中的常见错误

未经判定就使用

未经判定也就是说,没有判断向内存中的栈区申请空间这个操作是否成功,就使用了该部分内存,这显然是不合理的,极易产生错误,如以下代码:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int* arr = (int*)malloc(10*__INT_MAX__);
    int i = 0;
    for(i=0;i<10;i++)
    {
        *(arr+i) = i;
        printf("%d ",*(arr+i));
    }
    free(arr);
    arr =  NULL;
    return 0;
}

其中的_INT_MAX_代表着16进制数0x7fffffff,因此如此大的空间或许我们没有申请成功,但未经判断就在下面进行了使用,结果程序崩溃,如下:

在这里插入图片描述

如果我们进行判定,就会避免这个错误的产生,如下所示代码:

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

编译查看结果:
在这里插入图片描述
编译器提醒我们,没有足够的动态内存空间,这样就不会执行赋值代码,程序自然就不会奔溃,因此,申请到的动态内存空间在使用前进行判定十分重要

越界访问

越界访问这个词,我们不是第一次听说了,在数组中就存在着越界访问的问题,也就是没有那么大的地方,你非要访问那么大的地方,导致程序产生了错误,如以下代码:

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

从上述代码中我们可以看到,向动态内存在申请了40字节的空间,但是在赋值是我们缺赋值了11个整型元素也即44字节,此时就会产生越界访问的问题

但是在vscode下仍然没报错,看样子在这个编译器下,可能是编译器比较强(我猜的),因此就不演示了。

对非动态内存的释放

你明明没有使用动态内存定义,却对变量进行空间释放,就会产生错误,如以下代码:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int a  = 10;
    int* p = &a;
    free(p);
    p = NULL;
    return 0;
}

只是在栈区上定义了一个变量,你却对他进行了内存释放,显然不合理,因此也会产生错误,但是该从代码在VScode下,也正常编译了,因此在Linux下演示效果,编译结果如下:

在这里插入图片描述
可见,对非动态内存进行空间释放也会产生问题

动态释放部分空间

先上代码如下:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int* p = (int*)malloc(40);
    int i = 0;
    if (p == NULL)
    {
        return 0;
    }
    else
    {
    for(i=0;i<5;i++)
    {
        *p++ = i;
    }
    }
    free(p);
    p = NULL;
    return 0;
}

我们进行分析:在申请了动态内存后,判断,进行循环赋值,然后进行释放,但是其实在释放是就产生了问题,如下图:

在这里插入图片描述
再赋值完后,p指向的已经不再是最初的地址,因此对对其进行释放,将会释放此地址后的40个字节的内存,我们在Linux下编译运行,如下:
在这里插入图片描述
可见,释放一部分动态内存空间也会产生错误

对同一块内存进行多次释放

这个就比较好理解了,你再释放完后,又给人释放了,这叫什么事,代码如下:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int* p = (int*)malloc(40);
    if (p == NULL)
    {
        return 0;
    }
    else
    {
        int i = 0;
        for(i=0;i<10;i++)
        {
            *(p+i) = i;
        }
    }
    free(p);
    free(p);
    p = NULL;
    return 0;
}

查看结果:
在这里插入图片描述

忘记释放动态空间

这个就更好理解了,在上节课就介绍过了,就不再此处重复讲解了,请大家回看上节内容

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

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

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

相关文章

Slidev: 为开发者打造的演示文稿工具

非程序员开发者可以忽略&#xff0c;需要一定Markdown等知识要求。 官网地址&#xff1a;Slidev、开始使用 | Slidev 简介 Slidev (slide dev, /slʌɪdɪv/) 是基于 Web 的幻灯片制作和演示工具。它旨在让开发者专注在 Markdown 中编写内容&#xff0c;同时拥有支持 HTML 和…

二本4年测试经验,五面阿里(定薪35K),分享我的心得

6月跳槽&#xff0c;先后面试了多个大大小小的公司&#xff0c;拿了一些offer&#xff0c;有阿里&#xff0c;滴滴&#xff0c;快手&#xff0c;达达&#xff0c;得物等公司。面试的公司大部分都能过&#xff0c;所以这里给大家分享下自己的经验&#xff0c;也给自己做个归档&a…

2021年国赛高教杯数学建模E题中药材的鉴别解题全过程文档及程序

2021年国赛高教杯数学建模 E题 中药材的鉴别解题 原题再现 不同中药材表现的光谱特征差异较大&#xff0c;即使来自不同产地的同一药材&#xff0c;因其无机元素的化学成分、有机物等存在的差异性&#xff0c;在近红外、中红外光谱的照射下也会表现出不同的光谱特征&#xff…

软件工程-期末复习题

第1章软件工程概述 1、软件的概念及特点 概念&#xff1a; 计算机软件是由专业人员开发并长期维护的软件产品。完整的软件产品包括了在各种不同容量和体系结构计算机上的可执行的程序&#xff0c;运行过程中产生的各种结果&#xff0c;以及以硬复制和电子表格等多种方式存在的软…

ChatGPT 和爬虫有什么区别

目录 ChatGPT的概念和功能 爬虫的概念和功能 ChatGPT和爬虫的区别 ChatGPT的概念和功能 ChatGPT是一个基于自然语言处理和机器学习的智能对话模型&#xff0c;具有以下功能&#xff1a; 1. 问题回答&#xff1a;ChatGPT可以回答用户提出的各种问题。不论是有关常识、历史、科…

【数据结构】---TopK问题

本文提供用建堆来解决TopK问题的一个思路 N个数中找出最大的或者最小的前k个 假设现从N个数中找最大的前k个 ①堆排序&#xff0c;时间复杂度O(N*logN)&#xff0c;这N个数排一下序&#xff0c;前k个数就是需要的②建堆N个数的小堆&#xff0c;HeapPop 9次&#xff0c;就选出…

嵌入式工程师常见面试题(持续更新版本)

前言&#xff1a;鄙人于学堂求学十余载&#xff0c;终是要踏足江湖求一寸安身处&#xff01;以前都忙着学习新东西以及做项目&#xff0c;现如今也需要面对找工作的压力。此篇博客是作者准备的嵌入式工程师常见的面试题目汇总&#xff0c;其答案包含网络搜索和作者自己感悟总结…

6月,视频号爆火的账号有哪些?

六月伊始&#xff0c;视频号就借着六一节点上线青少年内容分级功能&#xff0c;让视频号内容及安全管理更精细化。紧接着开展了“特效大拍档”招募活动&#xff0c;激励各垂类头部创作者持续活跃&#xff0c;与他们共建更丰富健康的内容生态。在官方各种活动激励之下&#xff0…

Python语法基础07(文件与异常)

文件 输出文件中的内容 在项目代码同路径下创建一个pi_digits文件 3.14159265358979323846在fileDemo0.py中将其打开&#xff0c;并输出 #用函数open()打开文件&#xff0c;并将对象赋给file,对于open中的文件路径&#xff0c;可以使用相对路径也可以使用绝对路径 with ope…

2023年淘宝天猫内部大额隐藏粉丝福利购店铺优惠券领取入口在哪里怎么找到免费领取淘宝天猫优惠券?

草柴优惠券APP应用市场下载入口 草柴优惠券APP已上架的应用市场&#xff1a;华为应用市场、小米应用市场、OPPO应用市场、VIVO应用市场及百度手机助手&#xff0c;请打开以上应用市场搜索&#xff1a;草柴优惠券&#xff0c;即可下载通过应用市场审核验证通过的安全可信应用&a…

JavaWeb Cookie

1.Cookie 介绍 Cookie是一种用于在Web浏览器和Web服务器之间传递数据的机制。 它是由服务器发送给浏览器的小型文本文件&#xff0c;存储在浏览器的本地计算机上。 浏览器在后续请求中会自动将Cookie发送回服务器&#xff0c;以便服务器可以识别用户并提供个性化的服务。 C…

涨知识,周鸿伟当年踩的坑,如果用这么一个工具就能事半功倍

怎么让员工有效率地工作&#xff1f;如何考核员工&#xff1f;如何让员工有积极的心态&#xff1f;公司的汇报体系应该怎么设计&#xff1f; 这些问题都让360创始人周鸿伟感到困惑&#xff01; 说到“红衣大炮”周鸿伟的本事&#xff0c;那真的不是吹&#xff01; 近期&…

github:网址为 https://github.com/ 的网页可能暂时无法连接,或者它已永久性地移动到了新网址

一、无法访问github 二、尝试ping gitlab.com 三、打开站长工具 查找 ip地址 “www.github.com”A记录/cname检测结果--Dns查询|dns查询--站长工具 四、打开host文件&#xff08;C:\Windows\System32\drivers\etc&#xff09; 20.205.243.166 github.com 五、再次ping github&…

地图制图小技巧_点匹配线方向

目录 目的 实现步骤 功能介绍 功能入口 关键参数 结果 问题延伸 目的 我们在配图的时候&#xff0c;会遇到一种特定的需求&#xff1a;需要对点设置一个风格&#xff0c;并且符号风格自动跟相连或者相交的线保持垂直。 这种是否能够在SuperMap iDesktopX中自动实现呢&#xff0…

直流运算放大电路-----Howland(二)

目录 豪兰德电路形式1 电路图 计算公式 仿真与分析 豪兰德电路形式2 电路图 计算公式 豪兰德电路形式3 电路图 计算公式 改进电路 豪兰德电路形式1 模拟电子技术基础&#xff08;第五版&#xff09;5.7 电路图 计算公式 仿真与分析 如图&#xff0c;红框内为负反馈&…

.net项目开发-EF框架解决添加默认值问题

文章目录 前言EF中核心类DbContextDbContext中的SaveChanges()方法重写SaveChanges()方法注意点-Modified 其它状态下的实体如何操作 前言 最近开发.net项目&#xff0c;持久层用的是EF框架&#xff0c;也是第一次使用这个框架&#xff0c;用这个框架的好处就是基于实体的开发…

【UnityDOTS 小知识】如何通过DOTS修改材质属性以及替换材质与网格

如何通过DOTS修改材质属性以及替换材质与网格 一、DOTS修改材质属性 1.利用 Material Overide Asset Material Overide Asset是一个Unity资产&#xff0c;可以通过Create创建。 创建后指定要修改的材质&#xff0c;以及对应材质的属性&#xff0c;即可完成这个资源创建。 然…

hive关联键 NULL 关联 NULL

结论&#xff1a;关联键 NULL NULL时&#xff0c;不进行关联&#xff0c;即两表关联失败 案例如下&#xff1a; 表A 表B 表A 关联 表B selecta.id as a_id,a.name as a_name,b.id as b_id,b.name as b_name from表A a left join表B b on a.id b.id …

【FFmpeg实战】FFplay音视频同步

作者&#xff1a;Mirs 链接&#xff1a;https://www.jianshu.com/p/d7ead3a5f2bd PTS的由来 音视频同步依赖的一个东西就是pts&#xff08;persentation time stamp &#xff09;显示时间戳 告诉我们该什么时间显示这一帧 ,那么&#xff0c;这个东西是从哪里来的呢&#xff1f…

Jvm创建对象之内存分配-JVM(七)

上篇文章介绍了jvm创建&#xff0c;会校验是否已加载类&#xff0c;没有则加载&#xff0c;通过之前学的源码&#xff0c;classLoader加载完之后&#xff0c;虚拟机开始给类分配内存&#xff0c;指针移动分配和free链表分配&#xff0c;解决并发分配情况用cap和TLAB方法。之后设…