关于malloc问题的改错-笔试常考

计算机二级C语言备考指南:从基础语法到真题训练全解析 C语言作为编程基础核心,通过变量、函数、指针等概念构建程序逻辑。其编译型特性使代码直接转换为机器指令,提升执行效率。在系统编程、嵌入式开发等领域具有不可替代的技术价值。针对计算机二级考试,需要掌握数据类型、控制结构、数组字符串等语法细节,并通过程序填空、改错等题型训练调试能力。备考过程中,真题训练和错题复盘是关键环节,帮助考生巩固指针操作、文件处理等高频考点,最终实现从理论到实践的顺利过渡。 阅读详情

转载:http://liangbing8612.blog.51cto.com/2633208/697911


今年在面试中,也遇到了这样的笔试题,mark学习一下


情形1

 
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4.  
  5. void GetMemory(char *p)   
  6. {  
  7.     p=(char *)malloc(100);  
  8. }  
  9. void Test(void)   
  10. {  
  11.     char *str=NULL;  
  12.     GetMemory(str);  
  13.     strcpy(str,"helloworld");  
  14.     printf("%s\n",str);  
  15. }   
  16.  
  17. int main(void)  
  18. {     
  19.     Test();  
  20.     return 0;  
  21. } 

错误:
1. 调用GetMemory(str),属传值,str并未变化,仍为NULL
2. 调用strcpy,程序到这将产生错误,因为str并未指定某一内存。
3. malloc内存时可能会出错,需判断内存是否申请成功,加上:
    if(*p==NULL)
    {
        进行申请内存失败处理
    }
4. 动态创建的内存没释放
修改方法1:
    传址-----使用指向指针的指针

 
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4.  
  5. void GetMemory(char **p)   
  6. {  
  7.     *p=(char *)malloc(100);  
  8. }  
  9. void Test(void)   
  10. {  
  11.     char *str=NULL;  
  12.     GetMemory(&str);  
  13.     strcpy(str,"helloworld");  
  14.     printf("%s\n",str);  
  15. }   
  16.  
  17. int main(void)  
  18. {     
  19.     Test();  
  20.     return 0;  
  21. } 

 修改方法2:

 
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4.  
  5. char* GetMemory()   
  6. {  
  7.     char* p=(char *)malloc(100);  
  8.     return p;  
  9. }  
  10. void Test(void)   
  11. {  
  12.     char *str=NULL;  
  13.     str=GetMemory();  
  14.     strcpy(str,"helloworld");  
  15.     printf("%s\n",str);  
  16. }   
  17.  
  18. int main(void)  
  19. {     
  20.     Test();  
  21.     return 0;  
  22. } 

 情形2

 
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4.  
  5. char *GetMemory(void)  
  6. {  
  7.     char p[]="hello world";  
  8.     return p;  
  9. }  
  10. void Test(void)  
  11. {  
  12.     char *str=NULL;  
  13.     str=GetMemory();  
  14.     printf("%s\n",str);  
  15. }  
  16. int main(void)  
  17. {     
  18.     Test();  
  19.     return 0;  
  20. } 

错误原因:
    函数GetMemory中数组p为局部变量,在函数返回后,内存已经被释放,生存期结束。

情形3

 
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4.  
  5. void GetMemory(char **p,int num)   
  6. {  
  7.     *p=(char *)malloc(num);    
  8. }  
  9. void Test(void)   
  10. {  
  11.     char *str=NULL;  
  12.     GetMemory(&str,100);  
  13.     strcpy(str,"helloworld");  
  14.     printf("%s\n",str);  
  15. }    
  16.    
  17. int main(void)  
  18. {     
  19.     Test();  
  20.     return 0;  
  21. } 

可以打印出字符,但存在问题有:
    1. 函数GetMemory中,malloc内存后,未判断内存是否申请成功,应加上:
    if(*p==NULL)
    {
        //进行申请内存失败处理
    }
    2. 在Test函数中,未对malloc的内存进行释放。

情形4:

 
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4.  
  5. void Test(void)   
  6. {  
  7.     char *str=(char*)malloc(100);  
  8.     strcpy(str,"helloworld");  
  9.     printf("%s\n",str);  
  10.     free(str);  
  11. }    
  12.    
  13. int main(void)  
  14. {     
  15.     Test();  
  16.     return 0;  
  17. }  

存在问题有:
    1. malloc内存后,未判断内存是否申请成功
    2. 在free(str)后未置str为空,导致可能变成一个“野”指针,应加上:str=NULL

情形5

 
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4.  
  5. void Test(void)   
  6. {  
  7.     char *str=(char*)malloc(100);  
  8.     strcpy(str,"hello");  
  9.     //str+=6;  
  10.     free(str);  
  11.     if(str!=NULL)  
  12.     {  
  13.         strcpy(str,"world");  
  14.         printf(str);  
  15.     }  
  16. }    
  17.    
  18. int main(void)  
  19. {     
  20.     Test();  
  21.     return 0;  
  22. } 

在vc中可以输出"world",但这是不确定的值,存在的问题有:
    申请空间,拷贝字符串,释放空间.前三步操作都没有任何问题。到if语句里的判断条件开始出错了,因为一个指针被释放之后其内容并不是NULL,而是一个不确定的值。所以if语句永远都不能被执行.这也是著名的"野"指针问题.所以我们在程序中当释放一个指针后,一定要人为的将指针付成NULL。这样就会避免出现"野"指针的出现。有人说"野"指针很可怕,会带来意想不到的错误。

情形6

 
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4.  
  5. void swap(int *p1,int *p2)   
  6. {  
  7.      int *p;  
  8.      *p=*p1;  
  9.      *p1=*p2;  
  10.      *p2=*p;  
  11. }    
  12.    
  13. int main(void)  
  14. {     
  15.     int a=3;  
  16.     int b=5;  
  17.     swap(&a,&b);  
  18.     printf("a=%d,b=%d\n",a,b);  
  19.     return 0;  
  20. } 

    在swap函数中,p是一个“野”指针,未指向任何内存,所以当将值*p1赋给*p时,值*p1无处存放,会出错。有可能指向系统区,导致程序运行崩溃。
    可修改为:

 
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4.  
  5. void swap(int *p1,int *p2)   
  6. {  
  7.      int p;  
  8.      p=*p1;  
  9.      *p1=*p2;  
  10.      *p2=p;  
  11. }    
  12.    
  13. int main(void)  
  14. {     
  15.     int a=3;  
  16.     int b=5;  
  17.     swap(&a,&b);  
  18.     printf("a=%d,b=%d\n",a,b);  
  19.     return 0;  
  20. } 
嵌入式软件开发笔试面试知识点总结-C语言部分 C语言 简述编译运行一段代码的过程   源程序是指未经编译的,按照一定的程序设计语言规范书写的,人类可读的文本文件,源程序就是所写好的代码。   可执行程序,即常说的.exe程序,可以执行程序,完成计算机功能。在C语言中,.c文件就是所谓的源文件。   源程序到可执行程序的过程。在这个过程中,会发生如下的变化:   .c文件生成.obj文件的过程,称为编译,.obj文件生成到.exe文件的过程,称为链接。   .obj文件就是一个是程序编译生成的二进制文件,当.exe文件生成以后.obj文件就会被删除。 阅读详情

相关推荐

通俗理解Xgboost

为了简化计算,XGBoost采用了一阶导数(梯度)和二阶导数(Hessian)来近似损失函数的变化,从而推导出叶子节点值的更新公式。其中 z 就是所有树的叶子节点分数之和。通过这两个正则化项,XGBoost能够在优化目标函数时,不仅考虑损失函数的最小化,还考虑了模型的复杂度,从而达到更好的泛化性能。正则化项通常包括两个部分:一个是与叶子节点数量相关的项,另一个是与叶子节点输出值大小相关的项。通过这种方式,XGBoost能够有效地计算出每个叶子节点的值,同时通过正则化项来平衡模型的复杂度和泛化能力。

金融风控笔记 750

ESP32双模无线选型避坑指南:Wi-Fi与蓝牙共存的系统级权衡

Wi-Fi和蓝牙同属2.4GHz无线通信技术,其共存并非简单功能叠加,而是涉及射频干扰、协议栈资源竞争、电源完整性及认证合规性的系统工程问题。底层原理在于共享射频前端与有限内存带宽,导致Wi-Fi吞吐下降、蓝牙丢包或音频断续等确定性损耗。技术价值体现在降低EMC整改成本、提升多任务并发稳定性、保障FCC/CE整机认证一次通过率。典型应用场景包括智能门锁、工业传感器网关、低功耗资产追踪器及高可靠医疗辅具。当面临hc05蓝牙模块连接不上、esp32蓝牙和wifi可以一起用吗等高频问题时,需回归真实工况——流量模

weixin_33888907的博客 574

freeswitch之呼叫中心acd模块开发

一、定义: ACD(Automatic Call Distributor) 自动呼叫分配,也叫智能选择座席。它是呼叫中心整个前台接入系统逻辑功能的描述:把接入的呼叫转接到正确的座席员桌前。ACD是现代呼叫中心有别于一般的热线电话系统和自动应答系统的重要标志,其性能的优劣直接影响到呼叫中心的效率和顾客的满意度。 二、ACD包含的功能点: 1 、程控交换功能 ACD在本质上也是交换机的一种类型,必须具有程控交换最基本的话务交换功能。 2 、排队功能 ACD必须具有话务排队的功能,所谓排队是指在内线都

飞鸟的博客 1870

【C语言】关于malloc经典的笔试题

【C语言】关于malloc经典的笔试题

fufufu_的博客 869

用Matlab机器人工具箱搞定六轴机械臂建模:从DH参数到3D可视化(附完整代码)

本文详细介绍了如何使用Matlab机器人工具箱进行六轴机械臂建模,涵盖从DH参数转换到3D可视化的完整流程。通过正运动学验证、逆解计算和工作空间分析等实战案例,帮助开发者快速掌握机械臂建模技巧,并提供性能优化建议和完整代码示例。

weixin_28733637的博客 360

昇腾310B实战:FFmpeg硬件加速全流程解析与性能优化

本文详细解析了昇腾310B与FFmpeg硬件加速的全流程,包括环境配置、性能优化及常见问题排查。通过实战案例展示,昇腾310B在视频转码中性能提升可达6倍,同时降低功耗,特别适合多媒体处理和高性能计算场景。

m3n5b7v8c9x的博客 735

在定义数组以及malloc开辟空间时遇到的问题

数组溢出后仍能输出 当你的数组溢出时,VS会自动给你的变量进行赋值操作,而我的这个是int型变量,系统自动赋值为-858993460,并不存在什么溢出即为空的猜想。

qq_62324715的博客 542

2026闲鱼数据采集实战:本地YOLO识别滑块验证码+接口签名分析+零成本价格监控系统

2026闲鱼反爬系统升级实战:零成本解决方案 本文针对2026年闲鱼最新反爬机制提出了一套完整的零成本解决方案。系统面临四大挑战:AI滑块验证、接口签名升级、设备指纹绑定和精细化行为检测。通过以下技术突破实现稳定运行: 本地化AI破解:训练YOLOv11n模型实现98%准确率的滑块识别,替代付费打码平台 逆向工程:Hook闲鱼App签名算法,用Python重写HMAC-SHA256签名生成器 设备指纹管理:建立"一机一号一IP"机制,维护50+种设备特征 行为模拟:开发四阶段滑动轨迹模型

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1456

malloc笔试题解析

void GetMemory(char *p) { p = (char *)malloc(100); } void Test(void) { char *str = NULL; GetMemory(str); strcpy(str, "hello world"); printf(str); } test函数调用时,内部创建了指针变量str,它是一个局部变量。当把 实参str传给形参p时,形参p是一份临时拷贝,它有自己的独立空间。 malloc申请的空间,放进p时,并不会影响到str。 当.

yexixi06的博客 289

使用R语言整理GEO数据的简易教程

本教程介绍了使用R语言从GEO数据库下载数据并进行数据整理的基本步骤。根据实际研究问题,你可能需要进行更复杂的数据处理和分析。R语言作为一种强大的生物信息学工具,为GEO数据的整理、分析和可视化提供了丰富的功能和工具。希望这个教程能够帮助你入门GEO数据整理和R语言的应用。如果你在使用过程中遇到问题,或需要进一步的指导,请随时向我询问。祝你在GEO数据分析的旅程中取得成功!

Mrrunsen的博客 3743

深入理解Android音视频同步机制(三)NuPlayer的avsync逻辑

本文深入介绍了NuPlayer的avsync逻辑和原理

张晖的专栏 1万+

C语言动态内存管理笔试题

动态内存管理笔试题 一 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; } 程序运行结果:没有输出,奔溃 解释:str传递给GetMemory函数是值传递方式,所以GetMemory函数参数

weixin_46251230的博客 1430

百度AI架构师亲授:Agentic智能体在教育领域的落地(附个性化学习案例)

当我们谈论“教育智能化”时,我们真正需要的不是“更聪明的工具”,而是“能懂人的伙伴”——一个能像优秀教师那样主动观察、精准判断、动态调整的“数字助手”。Agentic智能体(智能体)正是这样的存在:它具备“自主性”(主动决策)、“反应性”(感知环境)、“目标导向”(聚焦学习目标)和“社会性”(与人/其他智能体协作),完美匹配教育场景中“个性化、动态化、协同化”的核心需求。本文将从底层逻辑到工程实现为什么Agentic是教育AI的“下一站”?(痛点与价值)Agentic智能体的核心架构是什么?

AI天才研究院 356

getmem函数的实现,笔试有改错的有要求直接写出来该函数的

#include #include #include #define CODE_FIXED /* 原因:传入pTemp分配内存,但getmem结束后,分配的空间被释放掉了 主函数定义了一个指针pTemp,但是没有给它分配内存,所以pTemp指向是一个无效的地址, 然后子函数参数分配了一个指针char *pStr,这个指针的所有权是子函数的, 当你调用子函数的时候,p

wgembed的专栏 1116

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

动态内存分配与管理详解(附加笔试题分析)

动态内存分配不像数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。能试试动态存开辟了。

2302_79376097的博客 1353

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【C++基础】内存操作 getMemory改错

内存操作的考察点:①指针 ②变量生存期及作用范围 ③动态内存申请和释放 笔试题****************************************************************************** //meitu笔试 内存管理 void getMemory(char *p){ p = new char[100]; } void test(){...

weixin_34194702的博客 203

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

神州数码笔试题

改错:char *string_test()//加头文件#include ;#include ;using namespace std;{    char *a="1234567890";    char c[10];    char *b;    b=malloc(sizeof(a));//改成b=(char *)malloc(sizeof(char)*10);    strcpy(b,a); 

Mabel的窝 2443

程序员笔试题收藏

1。什么是预编译,何时需要预编译: 答案:1、总是使用不经常改动的大型代码体。2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。 2。char * const p char const * p const char *p 上述三个有什么区别? 答案:char * const p; //常量指针...

weixin_30483697的博客 680

找工作笔试面试那些事儿(3)---内存管理那些事

作者:寒小阳时间:2013年8月。出处:http://blog.youkuaiyun.com/han_xiaoyang/article/details/10676931。声明:版权所有,转载请注明出处,谢谢。 七、内存管理 在写C/C++程序的时候,最头疼的部分一定包括内存管理,一提到内存管理总是提心吊胆,但是又不可避免地常常会遇到,而这块的知识也是公司招聘的一个评价方面,能够很好地体现笔试面试...

jishublog 95

找工作笔试面试那些事儿(2)---内存管理那些事

七、内存管理 在写C/C++程序的时候,最头疼的部分一定包括内存管理,一提到内存管理总是提心吊胆,但是又不可避免地常常会遇到,而这块的知识也是公司招聘的一个评价方面,能够很好地体现笔试面试者的功底。这部分的内容稍深一些,大家细心阅读,能对内存管理有一个比较好的把握。 7.1内存分配的方式 最长被问到的问题之一,基础中的基础。对C和C++而言,内存分配方式有三...

weixin_30662539的博客 85

内存管理那些问题

作者:寒小阳 时间:2013年8月。 出处:http://blog.youkuaiyun.com/han_xiaoyang/article/details/10676931。 声明:版权所有,转载请注明出处,谢谢。 七、内存管理        在写C/C++程序的时候,最头疼的部分一定包括内存管理,一提到内存管理总是提心吊胆,但是又不可避免地常常会遇到,而这块的知识也是公司招聘的一个

weihaolu的博客 540
上一篇: 多线程 面试题总结 14题(待完善)
下一篇: 2018校招 面试总结 (一)
穿斗牛士衣服的v
博客等级 码龄10年 2粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值