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

文章目录

前言

一、题目一

二、题目二

三、题目三

四、题目四

总结


前言

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


一、题目一

运行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进行解引用的操作而导致程序的崩溃
  • 未释放动态开辟的空间而造成内存泄漏
  • malloc 也有可能会开辟空间失败,未对其返回值进行判空的处理

修改: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 的返回值进行判空的操作(空间开辟失败,便不能打印出 hello );

运行结果如下:

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

四、题目四

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

报错,非法访问;

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

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


总结

错因:

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

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

3、野指针

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

内容概要:本文档是一份关于交换路由配置的学习笔记,系统地介绍了网络设备的远程管理、交换机与路由器的核心配置技术。内容涵盖Telnet、SSH、Console三种远程控制方式的配置方法;详细讲解了VLAN划分原理及Access、Trunk、Hybrid端口的工作机制,以及端口镜像、端口汇聚、端口隔离等交换技术;深入解析了STP、MSTP、RSTP生成树协议的作用与配置步骤;在路由部分,涵盖了IP地址配置、DHCP服务部署(接口池与全局池)、NAT转换(静态与动态)、静态路由、RIP与OSPF动态路由协议的配置,并介绍了策略路由和ACL访问控制列表的应用;最后简要说明了华为防火墙的安全区域划分与基本安全策略配置。; 适合人群:具备一定网络基础知识,从事网络工程、运维或相关技术岗位1-3年的技术人员,以及准备参加HCIA/CCNA等认证考试的学习者。; 使用场景及目标:①掌握企业网络中常见的交换与路由配置技能,提升实际操作能力;②理解VLAN、STP、OSPF、NAT、ACL等核心技术原理并能独立完成中小型网络搭建与调试;③通过命令示例熟悉华为设备CLI配置逻辑,为项目实施和故障排查提供参考。; 阅读建议:此笔记以实用配置为主,建议结合模拟器(如eNSP或Packet Tracer)动手实践每一条命令,对照拓扑理解数据流向,重点关注VLAN间通信、路由选择机制、安全策略控制等关键环节,并注意不同设备型号间的命令差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值