解题--有关动态内存开辟 几道经典的笔试题

news2024/11/15 11:47:41

文章目录

前言

一、题目一

二、题目二

三、题目三

四、题目四

总结


前言

路漫漫其修远兮,吾将上下而求索。


一、题目一

运行Test 函数会出现什么样的结果?

在Test函数之中,首先创建了一个指针变量 str , 并将其赋值为NULL; 接下来便调用函数GetMemory ,采用传值调用的形式将实参str 的值传给了形参p ,显然在传值调用之中,形参的是对实参的临时拷贝,即改变形参不会影响实参

在函数GetMemory中,利用malloc 进行了动态内存空间的开辟,并且将此块空间的地址赋给了之指针变量p,指针p 作为作用域仅在函数GetMemory中,即进入GetMemory的范围时,指针变量p会创建,出了GetMemory的范围时,指针p会销毁;

调用完GetMemory函数之后,利用malloc 所开辟的内存空间仍然存在,但是由于指针变量p 已然被销毁,所以便不知道malloc所开辟的空间的地址;传值调用中对形参的改变并不会影响实参,故而str 中存放的依然是NULL;

在Test 函数中,接下来是库函数strcpy 的使用,str 为NULL,在之前模拟实现strcpy 中,我们知道其实现流程会对str 进行解引用操作,而NULL为空指针,即没有指向任何一块空间的指针;对空指针进行解引用操作会让程序崩溃;

其次是,在函数GetMemory中利用malloc进行动态内存的开辟,但是在后面的代码中并未释放次空间,况且也找不到此空间;于是乎会造成内存泄漏;

综上,该代码运行时会出错;存在两点问题;

  • 对NULL进行解引用的操作而导致程序的崩溃
  • 未释放动态开辟的空间而造成内存泄漏

修改:1、传址调用 2、释放动态开辟的空间

注:printf(str);

库函数printf 的第一个参数是字符串中首字符的地址;

二、题目二

运行Test 函数会出现什么样的结果?

字符数组p在函数GetMemory 之中创建,出了其作用域而会被销毁,即字符数组p所占用的内存空间会被操作系统回收;而str 又接收了函数GetMemory 返回此空间的起始地址,那么str 便就是野指针;

故而此代码在运行时报错,出错的原因:存在野指针;

此题还可以用函数栈帧的知识进行解释:

当调用完GetMemory函数要返回的时候,GetMemory函数的函数栈帧便会销毁,即为GetMemory开辟的空间会被操作系统回收,故而数组p所占用的空间不属于该程序,但是在Test 函数中,指针变量str 仍然指向了那块不属于此程序的空间,即指针str 为野指针;

运行该程序输出的结果如下图:

此块空间中的内容为什么被修改了呢?

由上图可知,当函数GetMemory 返回的时候,其函数栈帧便会销毁,紧接着便会返回调用GetMemory的位置,然后执行以下的代码:printf(str) ; printf 为库函数,在使用的时候也会创建属于库函数printf 自己的函数栈帧,即会对Test 函数栈顶上的空间进行重新使用,那么原来GetMemory函数中变量p 所占的空间里存放的数据便很有可能被覆盖;而一旦被覆盖,那么此空间中的值便被改变了;

三、题目三

运行Test 函数会出现什么样的结果?

能打印出 hello ,但是未释放动态开辟的空间,故而存在内存泄漏

运行结果如下:

修改:释放malloc 动态开辟的空间;

四、题目四

运行Test 函数会出现什么样的结果?

报错;

free 之后,那么malloc 所开辟的这块空间便不再属于该程序,即使str != NULL ,后面对于str 的操作均属于非法访问;况且此处未对malloc 的返回值进行判断,毕竟malloc 也有开辟空间失败而返回NULL 的可能性;

修改:free之后,将str 置空;


总结

错因:

1、动态开辟的空间未释放

2、对空指针进行解引用操作

3、野指针

4、非法访问(所访问的空间已经不属于当前程序);

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

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

相关文章

查看HBA卡是否支持FC协议

cat /sys/class/fc_host/host*/port_name lspci | grep -i fibre # 看有无fibre channel控制器 官网查询 Emulex Lpe32000 https://docs.broadcom.com/doc/12357773 https://cn.genuinemodules.com/image/catalog/pdf/18/LPe32000.pdf

Python【2】问题

目录 模块与包是什么? 赋值、浅拷贝和深拷贝的区别? Python中如何生成随机数? Python中的os模块常用方法?□ os.path和sys.path分别表示什么意思?□ 赋值 read、readline和readlines的区别? 介绍一…

vTESTstudio系列13--vTESTstudio中的动态函数库介绍3

在上一篇文章中(vTESTstudio系列12--vTESTstudio中的动态函数库介绍2),给大家介绍了如何通过osek_tp.dll的接口去发送诊断指令,本篇文章给大家介绍如何去处理诊断回复内容,确保实际的诊断回复是符合需求。Lets Go!!! …

Java项目: 基于SpringBoot+mysql在线文档管理系统(含源码+数据库+开题报告+答辩PPT+毕业论文)

一、项目简介 本项目是一套基于SpringBootmysql在线文档管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、功…

VScode:前端开发中的常用快捷键和技巧

1.菜单栏 2.内容相关: 格式化文档 搜索文件名

海外盲盒APP系统开发,盲盒全球化发展机遇

盲盒全球化 近几年,盲盒在海外市场中迎来了爆发式增长,成为了一种新的潮流,拥有极高的人气,盲盒出海也已经成为了一个大风口,为我国盲盒市场带来了商业机遇!在盲盒出海的热潮下,海外盲盒APP系统…

相亲交友系统开发中的关键要素

相亲交友系统开发旨在构建一个在线平台,专为单身人士设计,以促进他们寻找合适的伴侣或朋友。以下是该系统开发的关键要素: 用户账户管理:允许用户创建账户,进行注册和登录,以便他们能够建立个人资料并参与…

01:【铁头山羊stm32-HAL库】对GPIO的操作

对GPIO的操作 1、LED闪烁2、按键控制LED3、芯片调试接口被锁死导致无法下载程序 1、LED闪烁 使用的是STM32CubeMXKeilv5进行HAL库的开发。 开发的步骤: 第一步:新建工程 第二步:选择芯片 第三步:如下图哈哈 第四步:…

图像去噪实验:基于全变分(TV)模型的MATLAB实现

一、背景 全变分模型在图像处理领域中被广泛用于去除噪声,同时保持图像边缘的清晰度。 二、实验步骤 图像的读取、噪声添加、去噪处理以及结果的显示。 三、实验仿真结果图 四、结论 全变分模型是一种有效的图像去噪方法,它能够在去除噪声的同时&#…

shell脚本的变量与应用

Shell脚本是一种解释性语言,用于编写自动化任务和系统管理脚本。在Shell脚本中,变量用于存储和操作数据。变量在脚本中可以被赋值、读取和修改。 在shell脚本中,变量用于存储数据,可以是数字、字符串或其他类型的值。可以使用…

基于yolov8的道路病害道路裂缝道路坑洞检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的道路病害检测系统,特别是针对道路裂缝和坑洞的检测,是一种高效、准确的智能解决方案。该系统利用YOLOv8这一先进的深度学习算法,通过深度神经网络对图像进行特征提取和分类,实现对道路病害的实时检测和…

期权会不会爆仓?如果期权亏了,会亏到倒欠吗?!

今天带你了解期权会不会爆仓?如果期权亏了,会亏到倒欠吗?!期权作为一种金融衍生工具,已经被广大的投资者所接受,并广泛地应用于风险管理等诸多领域。 期权会爆仓吗? 对于期权而言,…

杭州网站建设网页手机版

杭州作为中国的电子商务之都,网站建设在杭州可谓是异常繁荣。随着移动互联网的兴起,越来越多的企业开始注重网页的手机版建设,以满足用户在移动设备上的浏览需求。杭州网站建设公司也专门针对手机版网页进行优化,提供更好的用户体…

AUTOSAR Adaptive与智能汽车E/E架构发展趋势

AUTOSAR Adaptive是一个面向现代汽车应用需求的标准,特别适用于那些需要高计算能力和灵活性的应用。以下是AUTOSAR Adaptive的典型特性: 高计算能力:AUTOSAR Adaptive支持使用MPU(微处理器),这些处理器的性…

2024上半年上海产业转移分析报告

近日,由工业和信息化部举办的2024中国产业转移发展对接活动成功举办。作为全国唯一一个聚焦产业转移的“国字号”盛会,中国产业转移发展对接活动旨在通过跨区域的产业合作与对接,推动产业有序转移和区域协调发展,目前已于四川、贵…

无人机螺旋桨常见材料!!!

一、常见材料及其特点 复合材料(如玻璃纤维、碳纤维) 特点:轻量化、坚韧、高效。这些复合材料由玻璃纤维、碳纤维等在树脂基体中制成,可以显著提高无人机的飞行效率和稳定性。碳纤维复合材料尤其具有重量轻、抗张强度高、耐腐蚀…

Leetcode面试经典150题-83.删除链表中的重复元素

解法都在代码里,不懂就留言或者私信 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val …

Linux-目录结构和Vim编辑器

目录 Linux目录结构 基本介绍 ​编辑 具体的目录结构 Vim编辑器 vi和vim的基本介绍 vi和vim常用的三种模式 正常模式 插入模式 命令行模式 各种模式的相互切换 vim快捷键盘图 粘贴与删除 拷贝当前行并粘贴 拷贝多行并粘贴 删除当前行 删除多行 Vim的退出保存…

ARM的寄存器组织

cpu读写内存 读:(地址)内存的值拷贝到寄存器 写:将寄存器的值拷贝到内存 R0-R12:通用寄存器 sp:栈区的栈顶的地址 lr:保存返回地址 比如函数调用处的下一条指令的地址 pc:程序计数器…

【机器学习】梯度提升和随机森林的概念、两者在python中的实例以及梯度提升和随机森林的区别

引言 梯度提升(Gradient Boosting)是一种强大的机器学习技术,它通过迭代地训练决策树来最小化损失函数,以提高模型的预测性能 随机森林(Random Forest)是一种基于树的集成学习算法,它通过组合多…