动态内存管理笔试题

目录

  • 1.第一题
    • 1.1如何修改
  • 2.第二题
    • 2.1题想
    • 2.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);
}

请问运⾏Test 函数会有什么样的结果?

我们来分析一下这个程序:
首先我们创建一个指针变量str,指向NULL,将其做参数传给函数GetMemory,进入函数;
我们在函数中申请100字节的空间,首地址给形参p,结束函数的调用;
出函数后,我们销毁了形参p;
但是str还是指向NULL,strcpy函数必会对str进行解引用,不能对空指针进行解引用,所以会崩溃;
在这里插入图片描述

1.1如何修改

这里我们可以有两种修改方法;
第一种:
str传进这个函数的方式是传值调用,并不会影响到str的值,所以我们可以传进str的地址:

void GetMemory(char** p)
{*p = (char*)malloc(100);
}
void Test(void)
{char* str = NULL;GetMemory(&str);strcpy(str, "hello world");printf(str);free(str);str = NULL;
}int main()
{Test();return 0;
}

运行结果:
在这里插入图片描述
第二种:
我们也可以将修改后的指针返回出函数:

char* GetMemory(char* p)
{p = (char*)malloc(100);return p;
}
void Test(void)
{char* str = NULL;str = GetMemory(str);strcpy(str, "hello world");printf(str);free(str);str = NULL;
}int main()
{Test();return 0;
}

运行结果:
在这里插入图片描述

2.第二题

char* GetMemory(void)
{char p[] = "hello world";return p;
}
void Test(void)
{char* str = NULL;str = GetMemory();printf(str);
}

请问运⾏Test 函数会有什么样的结果?

我们先来分析一下这个函数:
在这里插入图片描述
这题其实不难,等GetmMemory函数返回后,使用str指针去访问p数组,就是非法访问,因为p数组的内存已经还给了操作系统,所以,str是野指针;
运行出来结果并不是我们所想的hello world:
在这里插入图片描述

2.1题想

我们通过此题,我们发现,函数是不能返回栈空间的地址

2.2深刻理解

但是有人可能会甩出这样的代码:

int* test()
{int n = 10;return &n;
}int main()
{int* p = test();printf("%d\n", *p);
}

运行结果:
在这里插入图片描述
这不也是打印出结果了吗?
这里偶然的成功并不是长久之计;因为这里p指向的内存并没有被覆盖,所以我们可以打印出,如果我们在打印前加上一个其他的打印:

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

那运行结果就大差人意了:
在这里插入图片描述
到这你一定对这题有了更深刻的理解了;

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

请问运⾏Test 函数会有什么样的结果?

这个代码有点像第一题的优化方案,但是有没有什么问题呢?

其实这个代码已经很完善了,但是没有free,所以我们应该这样改:

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

所以各位在申请空间后一定要记得归还,不然可能会出问题;

4.第四题

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

请问运⾏Test 函数会有什么样的结果?

这题其实是考察我们free函数是否可以将指针置空,我们前面在讲动态内存管理的时候我们就知道了,free函数并不会给指针置空;所以也会打印出world:
在这里插入图片描述

此题告诉我们free函数并不会置空,所以我们应当添上;

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

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

相关文章

SSM湘农乐市农产品交易平台-计算机毕业设计源码28246

目 录 SSM湘农乐市农产品交易平台 1 绪论 1.1研究背景 1.2研究意义 1.3研究方法 1.4论文结构与章节安排 2 湘农乐市农产品交易平台系统分析 2.1 可行性分析 2.2 系统流程分析 2.3 系统功能分析 2.4 系统用例分析 2.5本章小结 3 湘农乐市农产品交易平…

环境对于写作有何影响?

如果你是有灵性、热爱文学创作的人,多半就会喜欢安静的生活环境。因为你会感受到唯有在这样的环境里更才能够沉下心来思考创作的路径。而且此时的你,显得头脑清醒、思维活跃而自由,因之文思泉涌。 网络图:宁静的书房 反之&#x…

【工作流引擎集成】springboot+Vue+activiti+mysql带工作流集成系统,直接用于业务开发,流程设计,工作流审批,会签

前言 activiti工作流引擎项目,企业erp、oa、hr、crm等企事业办公系统轻松落地,一套完整并且实际运用在多套项目中的案例,满足日常业务流程审批需求。 一、项目形式 springbootvueactiviti集成了activiti在线编辑器,流行的前后端…

Case:cocos地图和网格初始化

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言非盈利博客,只是学习笔记,如有雷同,十分抱歉。 一、生成一个100*100的网格背景代码分析导入必要的模块定义装饰器和类类定义…

c++继承(下)

c继承(下) (1)继承与友元(2)继承与静态成员(3)多继承及其菱形继承问题3.1 继承模型3.2 虚继承3.3 多继承中指针偏移问题 (4)继承和组合(9&#xf…

Pytorch实现心跳信号分类识别(支持LSTM,GRU,TCN模型)

Pytorch实现心跳信号分类识别(支持LSTM,GRU,TCN模型) 目录 Pytorch实现心跳信号分类识别(支持LSTM,GRU,TCN模型) 1. 项目说明 2. 数据说明 (1)心跳信号分类预测数据集 3. 模型训练 (1)项目安装 &am…

大模型项目如何判断用RAG还是微调

大模型项目如何判断用RAG还是微调 在大模型项目中,选择使用检索增强生成(Retrieval-Augmented Generation, RAG)还是微调(Fine-Tuning)取决于多个因素,包括项目的具体需求、数据的可用性、性能要求、成本和…

jQuery——平滑翻页

平滑翻页 param next true:下一页 false:下一页 本文分享到此结束,欢迎大家评论区相互讨论学习,下一篇继续分享jQuery中循环翻页的学习。

自动驾驶传感器系列—自动驾驶中的“眼睛”:摄像头技术详解

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

字节放大招:无需LORA训练,小红书写真轻松搞定,Pulid-Flux换脸方案来了

前言 在这之前,SD常用的换脸节点还不支持Flux模型,使用Flux 做虚拟模特最好的方法是炼制人脸lora,但是炼丹是个有技术门槛的活。 之前文章有提过字节跳动的 Pulid团队,率先推出了Pulid-Flux模型,但是之前只能在线上使用…

这些编程工具竟然能让我效率翻倍?开发者必备神器盘点!

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…

【STL】stack模拟实现

stack模拟实现比较简单&#xff0c;就是直接调用deque的函数即可。 具体实现&#xff1a; #pragma once#include<deque> #include<iostream>using std::istream; using std::ostream; using std::endl; using std::cout;namespace zyy { //stack -> 后进先出t…

美客多测评系统:批量注册买家号的新利器

美客多&#xff08;MercadoLibre&#xff09;测评系统作为一种在跨境电商领域广泛应用的策略&#xff0c;其核心在于通过批量注册并管理买家账号&#xff0c;模拟真实用户的购物行为&#xff0c;以提升产品的销量、评价数量和店铺权重。以下是对美客多测评系统中批量注册买家号…

数字化转型的实践路径:如何运用TOGAF框架推动企业变革

数字化转型的迫切性与挑战 随着技术的飞速发展和全球市场的快速变化&#xff0c;数字化转型已经成为企业提高竞争力、推动创新、提升运营效率的核心战略。然而&#xff0c;数字化转型并不是简单的技术升级&#xff0c;它涉及到从业务模式、组织结构到技术架构的全面变革。企业…

为什么营业执照显示经营异常

经营异常是怎么回事&#xff1f;是什么意思&#xff1f;1、年报未依照正常的时间公示或者某些要素没有公示;2、营业执照的地址与实际的地址不符&#xff0c;该地址联络不到人。经营异常不处理有什么后果&#xff1f;有什么影响&#xff1f;企业被列入工商异常一般会对公司的经营…

实操了 AI 大模型项目的落地过程,成功实现了向 AI 大模型工程师的华丽转变

前言 根据《2024 年全球人工智能行业报告》最新的数据显示&#xff0c;全球 AI 市场预计将以每年超过 40% 的速度增长&#xff0c;到 2030 年市值将达到数万亿美元&#xff0c;这也是预示着在接下来的十年到十五年里&#xff0c;人工智能将获得巨大的发展红利。 在过去的一年…

大语言模型入门(四)——检索增强生成(RAG)

一、什么是检索增强生成 检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;RAG&#xff09;由Facebook AI Research&#xff08;FAIR&#xff09;团队于2020年首次提出&#xff0c;这是一种结合了信息检索技术与语言生成模型的人工智能技术。它通过从外部知…

分词的艺术:为AI拆解文本

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Koa学习

Koa 安装与配置 1. 初始化项目 在终端中执行以下命令&#xff1a; # 创建项目文件夹 mkdir koa cd koa# 初始化并安装依赖 npm init -y npm install koa npm install nodemon --save-dev2. 修改 package.json 在 package.json 文件中进行如下修改&#xff1a; {"type…

LabVIEW提高开发效率技巧----点阵图(XY Graph)

在LabVIEW开发中&#xff0c;点阵图&#xff08;XY Graph&#xff09; 是一种强大的工具&#xff0c;尤其适用于需要实时展示大量数据的场景。通过使用点阵图&#xff0c;开发人员能够将实时数据可视化&#xff0c;帮助用户更直观地分析数据变化。 1. 点阵图的优势 点阵图&…