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

2024-09-05 03:04

本文主要是介绍解题--有关动态内存开辟 几道经典的笔试题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

前言

一、题目一

二、题目二

三、题目三

四、题目四

总结


前言

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


一、题目一

运行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.chinasem.cn/article/1137788

相关文章

HotSpot虚拟机的经典垃圾收集器

读《深入理解Java虚拟机》第三版笔记。 关系 Serial、ParNew、Parallel Scavenge、Parallel Old、Serial Old(MSC)、Concurrent Mark Sweep (CMS)、Garbage First(G1)收集器。 如图: 1、Serial 和 Serial Old 收集器 2、ParNew 收集器 3、Parallel Sc

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述

两道笔试题

“char a='\72'”是什么意思? 这么理解:\为转义字符,\072转义为一个八进制数072,也就是十进制数的58买一送一,将转义字符对照表也一并贴给你吧:转义字符 意义 ASCII码值(十进制) \a 响铃(BEL) 007 \b 退格(BS) 008 \f 换页(FF) 012 \n 换行(LF) 010 \r 回车(CR) 013 \t 水平制表(HT) 009 \v 垂直制表(VT

嵌入式面试经典30问:二

1. 嵌入式系统中,如何选择合适的微控制器或微处理器? 在嵌入式系统中选择合适的微控制器(MCU)或微处理器(MPU)时,需要考虑多个因素以确保所选组件能够满足项目的具体需求。以下是一些关键步骤和考虑因素: 1.1 确定项目需求 性能要求:根据项目的复杂度、处理速度和数据吞吐量等要求,确定所需的处理器性能。功耗:评估系统的功耗需求,选择低功耗的MCU或MPU以延长电池寿命或减少能源消耗。成本

Leetcode面试经典150题-128.最长连续序列-递归版本另解

之前写过一篇这个题的,但是可能代码比较复杂,这回来个简洁版的,这个是递归版本 可以看看之前的版本,两个版本面试用哪个都保过 解法都在代码里,不懂就留言或者私信 class Solution {/**对于之前的解法,我现在提供一共更优的解,但是这种可能会比较难懂一些(思想方面)代码其实是很简洁的,总体思想如下:不需要排序直接把所有数放入map,map的key是当前数字,value是当前数开始的

力扣 739. 每日温度【经典单调栈题目】

1. 题目 理解题意: 1.1. 给一个温度集合, 要返回一个对应长度的结果集合, 这个结果集合里面的元素 i 是 当前 i 位置的元素的下一个更高温度的元素的位置和当前 i 位置的距离之差, 若是当前元素不存在下一个更高温度的元素, 则这个位置用0代替; 2. 思路 本题用单调栈来求解;单调栈就适用于来求当前元素左边或者右边第一个比当前元素大或者小的元素;【单调栈:让栈中的元素保持单调

华为23年笔试题

消息传输 题目描述 在给定的 m x n (1 <= m, n <= 1000) 网格地图 grid 中,分布着一些信号塔,用于区域间通信。 每个单元格可以有以下三种状态:  值 0 代表空地,无法传递信号;  值 1 代表信号塔 A,在收到消息后,信号塔 A 可以在 1ms 后将信号发送给上下左右四个方向的信号塔; 值 2 代表信号塔 B,在收到消息后,信号塔 B 可以在 2ms

实现的动态规划问题华为笔试题C++实现

秋招刷力扣题,我觉得我对动态规划不是熟练,在此处做总结 动态规划(Dynamic Programming,DP)算法通常用于求解某种具有最优性质的问题。在这类问题中,可能会有许多可行解,每一个解都对应一个值,我们希望找到具有最优值的解。我觉得最大的问题就是对问题的分解,分解后的问题与分解前的问题具有相同的决策机制,将决策机制进行抽象,最终可以得到对应的解; 动态规划中开始介绍的爬楼梯等问题,答

某公司笔试编程题

参加了某公司编程题,这些题都来自牛客网,记录总结吧! 一、蛇形矩阵 题目描述 蛇形矩阵是有1开始的自然数依次排列成的一个上三角矩阵. 接口说明 void GetResult(int Num, int* pResult);输入参数:int Num :输入的正整数N输出参数:int *pResult: 指向放蛇形矩阵的字符串指针指针指向的内存区域保证有效 样例输入: 4