【进阶C语言】有关动态内存管理的经典笔试题(详细图文讲解)

news2024/11/20 11:25:51

在这里插入图片描述
前言

📕作者简介:热爱跑步的恒川,致力于C/C++、Java、Python等多编程语言,热爱跑步,喜爱音乐的一位博主。
📗本文收录于C语言进阶系列,本专栏主要内容为数据的存储、指针的进阶、字符串和内存函数的介绍、自定义类型结构、动态内存管理、文件操作等,持续更新!
📘相关专栏Python,Java等正在发展,拭目以待!


动态内存管理

  • 题目1:
  • 题目2:
  • 题目3:
  • 题目4:

题目1:

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 函数会有什么样的结果?

图片讲解:
在这里插入图片描述

p是形参,已离开就会被自动销毁,所以此时p不见了

在这里插入图片描述
该代码原理讲解:

  1. 调用GetMemory函数的时候,str的传参为值传递,p是str的临时拷贝,所以在GetMemory函数的内部将动态开辟空间的地址存放在p中的时候,不会影响str.所以GetMemory函数返回之后,str中依然是NULL指针,strcpy函数就会调用失败,原因是对NULL的解引用操作,程序会崩溃。
  2. GetMemory函数内容malloc申请的空间没有机会释放,造成了内存泄漏

题目2:

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函数内部创建的数组是临时的,虽然返回了数组的起始地址给了str,但是数组的内存出了GetMemory函数就被回收了,而str依然保存了数组的起始地址,这时如果使用str,str就是野指针。

int* test()
{
	int a = 10;
	return &a;
}

int main()
{
	int* p = test();
	printf("hehe\n");
	printf("%d\n", *p);

	return 0;
}

思考一下该代码的结果是什么?

答案是5,跟上面讲的原理一样

图片讲解:
在这里插入图片描述

题目3:

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 函数会有什么样的结果?

答案是缺少释放
正确更改代码的样子:

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);
}

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

题目4:

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没有被置为空指针
这才是正确的形式

void Test(void)
{
	char* str = (char*)malloc(100);
	strcpy(str, "hello");
	free(str);
	str = NULL;

	if (str != NULL)
	{
		strcpy(str, "world");
		printf(str);
	}
}

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

如果这份博客对大家有帮助,希望各位给恒川一个免费的点赞👍作为鼓励,并评论收藏一下,谢谢大家!!!
制作不易,如果大家有什么疑问或给恒川的意见,欢迎评论区留言。

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

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

相关文章

.class文件在线转成.java文件方法

使用背景: 工作中碰到老的项目就头疼,有些连源码都没有,解决bug只能从class文件反编译成java后,来读懂业务逻辑。 后来在网上找了一些工具来帮助class文件转码,有些遇到lamda表达式就转换错误,有些使用起…

正则表达式的字符串取反常用正则表达式

正则表达式的字符串取反操作 文件同步时,想要过滤掉扩展名为.tmp或者.TMP的临时文件,想要使用正则表达式对字符串进行取反操作。 注意:[^tmp]* 这种取反的表达式,只能表示匹配除了t、m、p以外的所有字符,是单字符匹配…

gRPC-Go源码解读三 服务端处理流程分析

相较于Client端的复杂处理流程,Server端相对来说简单了很多,核心就是创建个TCP套接字并监听,收到客户端连接请求则起个go协程处理,子协程根据请求中的服务名和方法名调用对应的服务方法处理,处理完成之后则返回响应。整…

叫板IT部门和专业软件公司,低代码成为企业数字化的新选择

从2017年政府将“数字经济”写入工作报告,到今年两会将企业数字化转型列为重点议题,数字化的口号已喊了6年。政策对于数字化的支持越来越坚定,令人欣喜的是,越来越多具有远见卓识的企业已将数字化建设作为工作重心。 然而&#xf…

【LeetCode】剑指 Offer 60. n个骰子的点数 p294 -- Java Version

题目链接:https://leetcode.cn/problems/nge-tou-zi-de-dian-shu-lcof/ 1. 题目介绍(60. n个骰子的点数) 把n个骰子扔在地上,所有骰子朝上一面的点数之和为 s。输入 n,打印出 s 的所有可能的值出现的概率。 你需要用一…

Vue.js条件渲染指令v-if及v-show

目录 一、v-if 二、v-show 三、v-if与v-show的选择 一、v-if v-if是Vue.js的条件语句,v-if指令用于条件性地渲染一块内容,这块内容只会在指令的表达式返回true的时候被渲染。需要特别注意的是,v-if所关联的是Vue.js的动态变量。 v-if的使用…

如何计算连续变量的熵

背景 做特征选择时,有时候会用到计算特征的信息熵,可是离散的好计算,但连续的呢?按照把连续变量离散的方法设置阈值点吗?好像比较麻烦,需要排序, 计算阈值。没有能自动的方法吗? 找…

动物养殖虚拟仿真之生猪屠宰VR教学系统

生猪屠宰是一个复杂而危险的工作,需要有严格的操作规程和丰富的经验。但是传统的生猪屠宰培训存在一些问题,例如成本高、难以模拟真实场景等。 为了解决这些问题,VR技术被应用到生猪屠宰培训中,广州华锐互动由此开发了生猪屠宰VR…

BOM(1)

BOM:浏览器对象模型,它提供了独立于内容而与浏览器窗口进行交换的对象,其核心对象是window,由一系列相关对象构成,并且每个对象都提供了很多方法和属性BOM的构成:BOM比DOM更大,它包含DOM。 …

Docker中安装redmine(亲自安装有效)

第一步: 官方的一键安装方式: curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun (我用的它) 国内 daocloud一键安装命令: curl -sSL https://get.daocloud.io/docker | sh ############################可能遇见问题##…

机器学习 day07(特征缩放)

特征缩放的作用 特征缩放可以让梯度下降算法运行的更快特征:X    对应的参数:W当一个特征的可能值范围很大时,一个好的模型会选择一个相对较小的对应参数值,因为W₁的一个非常小的变化会给估计价格产生非常大的影响&#xff0…

View系列

掌握View核心知识体系,两大方向:View事件分发,自定义View。 文章目录 一,基础知识1.1 页面创建1.2 页面管理 二,View事件分发2.1 基本概念2.2 分发流程2.3 面试题 三,View绘制3.1 measure(测量&…

C#+asp.net基于web的大学社团管理信息系统

本系统的模块是分为用户模块和管理员模块,管理员负责学生管理模块、社团管理模块、公告管理模块、留言管理模块、加入社团管理模块、活动管理模块、管理员管理模块。社团管理员则负责预约管理模块、活动报名的审核等。。 系统具有三类系统用户分别是:系统…

linux网络

查看网络接口信息 ifconfig mtu 最大传输单元 mtu和mss区别 hostname命令 永久修改 hostnamectl set-hostname 切换shell环境生效 或者vi hostname 编辑完重启生效 查看路由表条目route route查看或设置主机中路由表信息 route -n将路由记录中的地址信息显示为数字形式 …

MTU 网卡bond 简介

MTU 最大传输单元MTU(Maximum Transmission Unit,MTU),是指网络能够传输的最大数据包大小,以字节为单位。MTU的大小决定了发送端一次能够发送报文的最大字节数。如果MTU超过了接收端所能够承受的最大值,或者…

App Inventor 2 开发问答App

应用介绍 一个最基本的问答App开发,问答数据源来自csv文件格式,方便后续拓展成网络版的问答App。 事先出好题目、ABCD选择项及正确答案,先存在列表中,然后按顺序出题,答对则继续下一题,答错则Game over。 …

人工智能的前沿信息获取之使用谷歌学术搜索

谷歌学术是谷歌公司开发的一款专门针对学术搜索的在线搜索引擎[4],谷歌学术的网址为https://scholar.google.com,界面如图 6‑1所示。使用谷歌学术搜索可以检索会议或者期刊论文。只需要在检索框中输入关键字,然后点搜索按钮即可,…

了解Transformer架构的前奏_什么是预训练_理解预训练---人工智能工作笔记0034

我们会先来说预训练有什么用,其实 之前说的机器学习,其实都是跟数学相关性很大的,比如,支持向量机,回归算法, 1.最早的时候,做机器学习,就是偏数学的,比如用的决策树,支持向量机,线性回归,逻辑回归等算法. 这种是偏向数学的,偏向统计的. 然后这个深度学习,其实就是偏大数据的…

奥艺大会 | “OLYMP‘ARTS中国设计奖”在2023米兰设计周发布

由国际奥艺委员会、北京国际设计周和中国科学院大学魏桥国科联合实验室共同发起的“OLYMPARTS中国设计奖”(OlympArts China Design Awards)于当地时间2023年4月19日,在2023米兰设计周“中国日”活动中举行宣传推介活动。 (由左至…

缺失msvcp140.dll怎么办?msvcp140.dll下载

缺失msvcp140.dll怎么办?msvcp140.dll下载,作为Windows操作系统中必备的组件之一,msvcp140.dll是一款Microsoft Visual C Runtime的动态链接库文件,旨在提供必要的C运行环境支持,以让软件应用程序得以在Windows平台上可…