GetMemory 改错

简介: GetMemory 改错

试题4:

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

试题5:

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

 试题6:

void GetMemory( char **p, int num )
{
 *p = (char *) malloc( num );
}
void Test( void )
{
 char *str = NULL;
 GetMemory( &str, 100 );
 strcpy( str, "hello" );
 printf( str );
}

试题7:

void Test( void )
{
 char *str = (char *) malloc( 100 );
 strcpy( str, "hello" );
 free( str );
 ... //省略的其它语句
}

 

 解答:

 试题4传入中GetMemory( char *p )函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的值,执行完

char *str = NULL;
GetMemory( str );

后的str仍然为NULL;


  试题5中

char p[] = "hello world";
return p;

的p[]数组为函数内的局部自动变量,在函数返回后,内存已经被释放。这是许多程序员常犯的错误,其根源在于不理解变量的生存期。


 试题6的GetMemory避免了试题4的问题,传入GetMemory的参数为字符串指针的指针,但是在GetMemory中执行申请内存及赋值语句


*p = (char *) malloc( num );


 后未判断内存是否申请成功,应加上:


if ( *p == NULL )
{
 ...//进行申请内存失败处理
}


 试题7存在与试题6同样的问题,在执行


char *str = (char *) malloc(100);


 后未进行内存是否申请成功的判断; 另外,在free(str)后未置str为空,导致可能变成一个“野”指针,应加上:


str = NULL;


 试题6的Test函数中也未对malloc的内存进行释放。


 剖析:


 试题4~7考查面试者对内存操作的理解程度,基本功扎实的面试者一般都能正确的回答其中50~60的错误。但是要完全解答正确,却也绝非易事。


 对内存操作的考查主要集中在:


 (1)指针的理解;


 (2)变量的生存期及作用范围;


 (3)良好的动态内存申请和释放习惯。


 再看看下面的一段程序有什么错误:


swap( int* p1,int* p2 )
{
 int *p;
 *p = *p1;
 *p1 = *p2;
 *p2 = *p;
}


 在swap函数中,p是一个“野”指针,有可能指向系统区,导致程序运行的崩溃。在VC++中DEBUG运行时提示错误“Access Violation”。该程序应该改为:

swap( int* p1,int* p2 )
{
 int p;
 p = *p1;
 *p1 = *p2;
 *p2 = p;
}
相关文章
|
1月前
|
弹性计算 运维 安全
阿里云轻量服务器是什么?200M带宽配置价格清单,轻量详细介绍
阿里云轻量应用服务器(Simple Application Server)是面向个人开发者及中小企业的轻量级云服务,适用于网站建设、开发测试、小程序后端等场景。采用套餐式售卖,不支持自定义CPU、内存等配置,内置WordPress、宝塔面板、LNMP等应用镜像,支持一键部署。默认200M峰值带宽,最低38元/年起,操作简单、成本低,是快速搭建应用的理想选择。
382 11
|
7月前
|
自然语言处理 JavaScript API
【HarmonyOS Next之旅】HarmonyOS开发基础知识(一)
本文主要介绍了HarmonyOS应用开发中的基础知识、配置文件结构及其说明。内容涵盖用户应用程序的基本概念,包括应用形态(安装型与元服务)、包结构(APP Pack与HAP)、核心组件(Ability)以及相关文件(库文件、资源文件、配置文件等)。重点解析了`config.json`配置文件的组成与内部结构,如`app`(全局配置)、`deviceConfig`(设备配置)、`module`(模块配置)三大核心部分,详细说明了各属性的功能与约束。此外,还提供了具体示例,帮助开发者更好地理解和使用HarmonyOS的配置体系。适用于JS/ArkTS开发环境。
452 0
|
12月前
|
人工智能 搜索推荐 API
自学记录鸿蒙API 13:实现人脸比对Core Vision Face Comparator
在完成文本识别和人脸检测项目后,我深入学习了HarmonyOS Next API 13中的Core Vision Face Comparator API,开发了一个简单的人脸比对工具。该API能进行高精度人脸比对并给出相似度评分,应用场景广泛,如照片分类、身份认证、个性化服务等。通过初始化服务、加载图片、实现比对功能和构建用户界面,最终实现了可靠的人脸比对功能。未来计划将此技术应用于更复杂的场景,如照片管理和个性化服务,并探索与其他AI能力的结合。如果你也对人脸比对感兴趣,不妨从简单的比对功能开始,逐步实现自己的创意!
348 61
|
自动驾驶 物联网 5G
什么是 5G 以及它如何工作?
【8月更文挑战第23天】
3046 0
|
负载均衡 安全 网络协议
|
数据可视化 项目管理 UED
有哪些免费的设计协作工具?推荐六款实用工具
设计协作工具在跨团队合作和远程办公中发挥着重要作用,能打破沟通壁垒,促进实时交流与创意共享。文中介绍了六款实用工具:板栗看板、Pixso、Figma、Invision、Miro和Trello,它们各具特色,支持从项目管理到设计协作的多种需求。未来,这些工具将朝着功能集成化、智能化辅助、跨平台兼容性和增强第三方集成等方向发展,以提供更好的用户体验。
有哪些免费的设计协作工具?推荐六款实用工具
|
IDE 开发工具 C++
⚡【C++要笑着学】(40) OF框架:OpenFrameworks 框架介绍 | oF 文件结构 | 图形基础 | 使用 ProjectGenerator 创建项目
⚡【C++要笑着学】(40) OF框架:OpenFrameworks 框架介绍 | oF 文件结构 | 图形基础 | 使用 ProjectGenerator 创建项目
696 0
|
算法 数据中心 Python
Python雪花代码
在这段代码中,`SnowFlake`类用于生成唯一的ID。每次调用 `generate_id`方法时,它都会生成一个新的、唯一的ID。这个ID由时间戳、数据中心ID、工作机器ID和序列号组成,确保了在不同的时间、不同的数据中心、不同的工作机器上都能生成唯一的ID。
277 1
|
Python
Collatz conjecture
【6月更文挑战第3天】
329 10
|
机器学习/深度学习 数据采集 分布式计算
基于spark的大数据分析预测地震受灾情况的系统设计
基于spark的大数据分析预测地震受灾情况的系统设计
466 1

热门文章

最新文章