【C语言】动态内存经典笔试题(下卷)

news2024/11/28 4:50:17

前言

如果说动态内存是C语言给我们的一个工具,那么只有掌握了工具的特点我们才能更好地使用。

紧随上卷,我们再来看看动态内存另外两道经典的笔试题。

(建议没看过上卷的朋友可以先看完上卷再回来:【C语言】动态内存经典笔试题(上卷)-CSDN博客)

另外,如果光看想不出来的话,别忘了你还可以画图。

第三题

以下代码的运行结果是什么?为什么?

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

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;
}
分析:

这个代码与“动态内存经典笔试题(上卷)”的第一题十分相似,但是这里确实传的是&str,接收用的是char**,好像没有什么问题了。

其实,这个hello确实能打印,但是这块空间是我们动态开辟来的,而这个代码中并没有对其释放,所以存在的问题是内存泄漏

改正:

那么这个改正只需要free和置空指针就行了:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void GetMemory(char** p, int num)
{
	*p = (char*)malloc(num);
}

void Test(void)
{
	char* str = NULL;
	Getmemory(&str, 100);
	strcpy(str, "hello");
	printf(str);
	free(str);//释放
	str = NULL;//置为空指针
}

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

 第四题

以下代码的运行结果是什么?为什么?

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

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

int main()
{
	Test();
	return 0;
}
分析:  

我们首先申请了100字节的空间,将首地址交给str,然后free(str);就是将这块空间还给了操作系统,但是我们并没有将str置为空指针,所以str变为野指针,还是能找到这块空间,只是变成了非法访问,而且空间里的内容可能被修改了。

所以str!=NULL为真,会进入if语句,strcpy真的把"world"放进这块空间了(非法访问)。 

改正:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

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

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

这样就不会非法访问了。总结就是free完要置为空,避免成为野指针,造成非法访问。

到此,本文介绍,祝阅读愉快^_^

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

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

相关文章

【MySQL】(基础篇二) —— MySQL初始用

MySQL初始用 目录 MySQL初始用基本语法约定选择数据库查看数据库和表其它的SHOW 在Navicat中&#xff0c;大部分数据库管理相关的操作都可以通过图形界面完成&#xff0c;这个很简单&#xff0c;大家可以自行探索。虽然Navicat等图形化数据库管理工具为操作和管理数据库提供了非…

Kali Linux 2024.2

Kali Linux 2024.2 版本&#xff08;t64、GNOME 46 和社区包&#xff09; 比平常晚了一点&#xff0c;但 Kali 2024.2 来了&#xff01;延迟是由于实现这一目标的幕后变化所致&#xff0c;这也是人们关注的焦点。社区提供了大量帮助&#xff0c;这次他们不仅添加了新的软件包&…

腾讯医疗大模型,不止大模型

“千呼万唤始出来&#xff0c;腾讯健康终于祭出医疗大模型。但或许这只是新故事的开始。下一步通过应用场景的打磨&#xff0c;全面嵌入生态合作伙伴&#xff0c;才能让医疗行业加速全面拥抱「数智化」工具。 在今年几乎所有企业都卷入AI大模型这场豪赌时&#xff0c;腾讯健康…

刘强东的拼搏哲学与产品创新的启示

在当今这个快速变化的时代&#xff0c;成功不再是偶然&#xff0c;而是需要一种敢于挑战、敢于拼搏的精神。正如京东创始人刘强东所说&#xff1a;“实现梦想&#xff0c;记住这句话就够了。敢于挑战&#xff0c;敢于拼搏的人不一定能成功&#xff0c;但成功的人一定是敢于挑战…

04 uboot 编译与调试

新手不需要详细掌握 uboot,只需要知道它是一个什么东西即可,工作中也只是改一些参数而已。 1、uboot 是什么 Linux 系统要启动就必须需要一个 bootloader 程序,也就说芯片上电以后先运行一段 bootloader 程序。这段 bootloader 程序会先初始化 DDR 等外设,然后将 Linux 内…

超详解——python数字和运算——小白篇

目录 1.位运算 2. 常用内置函数/模块 math模块&#xff1a; random模块&#xff1a; decimal模块&#xff1a; 3.内置函数&#xff1a; 总结&#xff1a; 1.位运算 位运算是对整数在内存中的二进制表示进行操作。Python支持以下常见的位运算符&#xff1a; 按位与&…

【最新鸿蒙应用开发】——ArkUI两种开发范式

在进行鸿蒙应用开发&#xff0c;openHarmony提供了一种页面开发框架叫做ArkUI方舟框架来进行页面布局的开发。 ArkUI方舟UI框架 针对不同的应用场景及技术背景&#xff0c;方舟UI框架提供了两种开发范式&#xff0c;分别是基于ArkTS的声明式开发范式&#xff08;简称“声明式…

为什么会有虚像

本来我就打算写虚像相关的内容&#xff0c;实际上我看不懂光学的内容&#xff0c;我只是发觉书上没有使用变分法来做&#xff0c;而只是解析几何的变换&#xff0c;这个做法完全脱离实际&#xff0c;物理书为什么会这样写不知道原因&#xff0c;但是很明显这样的内容也非常的复…

基于可解释性深度学习的马铃薯叶病害检测

数据集来自kaggle文章&#xff0c;代码较为简单。 import numpy as np # linear algebra import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)# Input data files are available in the read-only "../input/" directory # For example, runni…

Modbus TCP转CanOpen网关携手FANUC机器人助力新能源汽车

Modbus TCP转CanOpen网关与FANUC机器手臂的现场应用可以实现FANUC机器手臂与其他设备之间的数据交换和通信。CANopen是一种常见的网络协议&#xff0c;用于处理机器和设备之间的通信&#xff0c;并广泛应用于自动化领域。而Modbus TCP是一种基于TCP/IP协议的通信协议&#xff0…

【C++关键字】auto的使用(C++11)

auto的使用&#xff08;C11&#xff09; auto关键字auto的使用细则auto使用场景 随着程序的复杂化&#xff0c;程序中用到的类型也越来越复杂化&#xff0c;经常体现在&#xff1a; 1.类型难以拼写 2.含义不明确导致容易出错 在C语言阶段处理这类问题的方法&#xff0c;可以使…

GDPU Java 天码行空15 数据库编程

一、实验目的 1、 了解数据库的基础知识。 2、 掌握MySQL的下载、安装与配置。 3、 掌握MySQL可视化工具的使用。 4、 了解SQL语言。 5、 掌握JDBC中的API&#xff0c;并能进行简单的数据库操作。 二、实验内容 1、 安装MySQL &#x1f468;‍&#x1f3eb; 视频教程 2、建…

计算机组成刷题一轮(包过版)

搭配食用 计算机组成原理一轮-CSDN博客 目录 一、计算机系统概述 选择 计算机系统组成 冯诺依曼机 软件和硬件的功能 CPU等概念 计算机系统的工作原理 机器字长 运行速度 求MIPS 编译程序 机器语言程序 平均CPI和CPU执行时间 综合应用 存储程序原理 二…

线性预测器的等价性

摘要 尽管线性模型很简单&#xff0c;但它在时间序列预测中表现良好&#xff0c;即使是在与更深入、更昂贵的模型竞争时也是如此。已经提出了许多线性模型的变体&#xff0c;通常包括某种形式的特征归一化&#xff0c;以提高模型的泛化。本文分析了用这些线性模型体系结构可表…

学生宿舍人走断电系统的开发

学生宿舍人走断电管理系统是一款智能化的电力管理设备&#xff0c;旨在解决学生宿舍用电问题。以下是一些该系统的功能特点: 1.智能控制:系统能够自动识别宿舍内是否有人&#xff0c;当无人时自动断电&#xff0c;避免能源浪费和事故的发生。 2.:系统具有过载保护、短路保护、过…

基于51单片机的串口乒乓球小游戏

基于51单片机的乒乓球小游戏 &#xff08;仿真&#xff0b;程序&#xff09; 功能介绍 具体功能&#xff1a; 1.用两块单片机串口进行通信&#xff1b; 2.一排LED模拟乒乓球运动&#xff08;哪里亮表示运动到哪&#xff09;&#xff1b; 3.当最左边LED亮&#xff0c;表示球…

C 语言实现Linux终端显示IP二维码

调试信息&#xff1a;开发者可以在终端生成二维码&#xff0c;包含调试信息或日志数据&#xff0c;便于移动设备扫描和查看。设备配置&#xff1a;物联网设备配置时&#xff0c;通过终端生成配置二维码&#xff0c;扫描后进行设备配置。 Ubuntu/Debian 环境安装二维码库 sudo a…

以无厚,入有间,做一件事为什么靠努力不行,不能长期维持

庖丁解牛&#xff0c;并不是在说人和技巧&#xff0c;而是在说解牛不在于刀的锋利&#xff0c;而是怎样才能做到让刀不产生损耗&#xff0c;就是熟悉牛肉纹路&#xff0c;按照纹路和肉骨间隙进行操刀。这就是尊重自然规律&#xff0c;对于人也是一样的&#xff0c;如果所有事情…

C# .NET 异步实现方式

一、异步编程模式 .NET 提供了执行异步操作的三种模式&#xff1a; 基于任务的异步模式 (TAP) &#xff0c;该模式使用单一方法表示异步操作的开始和完成。 TAP 是在 .NET Framework 4 中引入的。 这是在 .NET 中进行异步编程的推荐方法。 C# 中的 async 和 await 关键词以及 …

Day47 代码随想录打卡|二叉树篇---最大二叉树

题目&#xff08;leecode T654&#xff09;&#xff1a; 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 …