动态内存管理(下)

动态内存管理(上)-CSDN博客(malloc, realloc, calloc, free函数的用法以及注意事项等知识点)

动态内存管理(中)-CSDN博客(常见的内存出错问题)

---------------------------------------------------------------------------------------------------------------------------------前两节复习了动态内存函数和常见内存出错的问题。 这节主要分析几个容易出错的问题加深印象。

目录

题目一:空指针解引用问题

题目二: 野指针的访问

 题目三:二级指针修改指针实参

题目四:free后忘记将指针置空


题目一:空指针解引用问题

void GetMemory(char* p)
{
     p = (char*)malloc(100);
}
void Test(void)
{
     char* str = NULL;
     GetMemory(str);
     strcpy(str, "hello world");
     printf(str);
}

int main() 
{
     Test();
     return 0;
}

 请看这么一道题, Test()哪里出错了呢?

其实这里在str函数传参时是穿的NULL值过去给p, 修改p并没有修改str, str仍为NULL, 后续对str赋值是对控制真的解引用。如下: 

 

 

题目二: 野指针的访问

char *GetMemory(void)
{
        char p[] = "hello world";
        return p;
}
void Test(void)
{
        char *str = NULL;        
        str = GetMemory();
        printf(str);
}
int main()

{

        Test();

        return 0;

}

请问Test()函数哪里出错了呢?

这一题是野指针的解引用问题。 野指针。 GetMemory函数虽然返回了一个指针, 但是这个指针是在它自己的栈帧空间申请的一处空间, 而GetMemory在调用完毕之后销毁函数栈帧, 操作系统回收内存, 返回的指针所指向的就是一块没有权限访问的内存了, 也就是野指针。

如图: 

 

 题目三:二级指针修改指针实参

void GetMemory(char **p, int num)
{
        *p = (char *)malloc(num);
}
void Test(void)
{
        char *str = NULL;
        GetMemory(&str, 100);
        strcpy(str, "hello");
        printf(str);
}
 int main()

{

        Test();

        return 0;

}

 请问Test函数会有什么结果呢?

 这道题是题目一的改正, 这个时候已经能够很好的打印hello了。 

题目一我们知道是因为str传值, 修改形参不会修改实参。 而这个题将str的地址传送了过去, 想当于对于str的传址调用。 并且str是一个指针变量。 所以接收使用的二级指针。 

关系如图:

 

题目四:free后忘记将指针置空

void Test(void)
{
        char *str = (char *) malloc(100);
        strcpy(str, "hello");
        free(str);
        if(str != NULL)
        {
                strcpy(str, "world");
                printf(str);
        }
}

int main()

{

        Test();

        return 0;

}

请问Test中结果是什么?

会报错, 这又是野指针解引用问题。 

str虽然free了, 但是str这个时候指向的还是刚刚堆区申请的那处空间的首地址。 这块地址不是空指针, 进入if语句后strcpy发生野指针访问问题。 

如图:
 

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 学习和实践笔记(15):面向过程和面象对象其实很简单!

学完这一节,才真正明白了什么叫面向对象和面向过程,其实很简单~ 第一个例子:怎样把大象装进冰箱 这个很清楚很容易地可以列出第一步。 第二个例子:怎样制造一台汽车 这个就很难确定哪一步做第一步。 面向过程和面向对象的区别 …

快速学习springsecurity最新版 (版本6.2)---用户认证

简介 ​ Spring Security 是 Spring 家族中的一个安全管理框架。目前比较主流的是另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富,但是shiro并不简便,这里轻量级安全框架更推荐国产安全框架satokensatoken官网 ​ 一般大型的项目都…

如何在Ubuntu部署Emlog,并将本地博客发布至公网可远程访问

文章目录 前言1. 网站搭建1.1 Emolog网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2.Cpolar稳定隧道(云端设置)2.3.Cpolar稳定隧道(本地设置) 3. 公网访问测试总结 前言 博客作为使…

【JAVA高级面试题】运用锁机制实现一个自定义的阻塞队列

文章目录 前言实战演示写在最后 前言 前几天看见一个高级Java面试题,我觉得很有代表意义。既考察了面试者的基本锁机制运用,也了解了阻塞队列的产生实现原理。先分享出来,以供鉴赏。 面试题:实现一个自定义的阻塞队列&#xff0c…

大数据云计算 - 弹性计算技术全解与实践

文章目录 大数据云计算 - 弹性计算技术全解与实践一、引言弹性:不仅仅是扩展性技术与商业价值 二、基础概念什么是弹性计算?CPU与内存的动态分配与虚拟化的关系 类型公有云与私有云虚拟机、容器与无服务器 优势与挑战优势挑战 实例:Netflix的…

代码随想录算法训练营第二十四天 | 回溯算法理论基础,77. 组合 [回溯篇]

代码随想录算法训练营第二十四天 回溯算法理论基础什么是回溯法回溯法的理解回溯法模板 LeetCode 77.组合题目描述思路参考代码总结优化版本 回溯算法理论基础 文章讲解:代码随想录#回溯算法理论基础 视频讲解:带你学透回溯算法(理论篇&#…

体验一下UE5.3的Skeletal Editor

UE5.3中增加了蒙皮网格骨架编辑工具,用户无需导出Fbx就可以直接编辑蒙皮网格,支持修改绑定姿势的骨骼位置、修改蒙皮权重、对已蒙皮多边形进行编辑以及对蒙皮网格减免等操作,就来体验一下。 1.加载插件 要使用Skeletal Editor功能&#xff…

Linux第58步_备份busybox生成rootfs根文件系统

备份busybox生成rootfs根文件系统 打开终端 输入“ls回车” 输入“cd linux/回车” 输入“ls回车”,产看“linux”目录下的文件和文件夹 输入“cd nfs/回车”,切换到“nfs”目录 输入“ls回车”,产看“nfs”目录下的文件和文件夹 输入…

Conda管理Python不同版本教程

Conda管理Python不同版本教程 目录 0.前提 1.conda常用命令 2.conda设置国内源(以添加清华源为例,阿里云源同样) 3.conda管理python库 4.其它 不太推荐 pyenv管理Python不同版本教程(本人另一篇博客,姊妹篇&…

力扣 309. 买卖股票的最佳时机含冷冻期

题目来源:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/description/ C题解:动态规划 状态1:表示持有股票。更新为之前持有股票(dp[i-1][0])或者不持有股票且不处于冷冻期后买入&…

【Go语言】Go语言的数据类型

GO 语言的数据类型 Go 语言内置对以下这些基本数据类型的支持: 布尔类型:bool 整型:int8、byte、int16、int、uint、uintptr 等 浮点类型:float32、float64 复数类型:complex64、complex128 字符串:st…

创意办公:专注 ONLYOFFICE,探索办公新境界

一.ONLYOFFICE 介绍 ONLYOFFICE 是一个基于 Web 的办公套件,提供了文档处理、电子表格和演示文稿编辑等功能。它被设计为一个协作工具,支持多人实时协作编辑文档,并且可以在本地部署或者作为云服务使用。 二.ONLYOFFICE 特点和功能 以下是 …

Bert基础(三)--位置编码

背景 还是以I am good(我很好)为例。 在RNN模型中,句子是逐字送入学习网络的。换言之,首先把I作为输入,接下来是am,以此类推。通过逐字地接受输入,学习网络就能完全理解整个句子。然而&#x…

Eclipse - Text Editors (文本编辑器)

Eclipse - Text Editors [文本编辑器] References Window -> Preferences -> General -> Editors -> Text Editors Displayed tab witdth: 4 勾选 Insert spaces for tabs 勾选 Show line number References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.n…

《Solidity 简易速速上手小册》第8章:高级 Solidity 概念(2024 最新版)

文章目录 8.1 高级数据类型和结构8.1.1 基础知识解析更深入的理解实际操作技巧 8.1.2 重点案例:构建一个去中心化身份系统案例 Demo:创建去中心化身份系统案例代码DecentralizedIdentityContract.sol 测试和验证拓展案例 8.1.3 拓展案例 1:管…

ARM 之十六 详解 CMSIS 版本变迁、各组件使用示例

目前,CMSIS 已经发展到了第六版,其目录结构也发生了重大的变化。在不断发展中,很多原来 CMSIS 的组件被不断独立出去,并因此成立了很多开源社区,今天就来学习一下! 由于 CMSIS 已经包含了相当丰富的文档,因此,本文重点学习版本之间的变化以及一些实际使用示例。 什么是…

Git笔记——1

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 Git安装_centos 创建本地仓库 配置本地仓库 添加文件——场景一 查看.git文件 添加文件——场景二 修改文件 版本回退 总结 前言 世上有两种耀眼的光芒&#…

GaiaDB-X 获选北京国家金融科技认证中心「数据领域首批专项示范与先行单位」

2023 年 12 月 21 日至 22 日,「2023北京国际金融安全论坛暨金融科技标准认证生态大会」在北京金融安全产业园举办。百度智能云分布式数据库 GaiaDB-X 产品荣登「数据领域首批专项示范与先行单位」名单,并获得了由北京国家金融科技认证中心颁发的「数据产…

开源软件的利弊

目录 开源软件 优势 免费 透明 可更改 可协作 影响力 坏处 安全隐患 良莠不齐 学习成本 持续性问题 未知风险 开源软件 开源软件是一种基于开放协作和共享的软件开发模式,其利弊对于软件产业和社会发展具有重要意义 优势 免费 谁能拒绝不要钱的东西…

[ai笔记11] 论ai韭菜的自我修养

欢迎来到文思源想的ai空间,这是技术老兵学习ai以及观点分享的第11篇内容! 上班之后时间确实少了许多,但是最近也没闲着,关于ai的学习一直在探索两个部分,一个是看那本有名的书《这就是ChatGPT》,另外一个则…