关于内存的编程题,对异常: 0xC0000005 的分析以及解决办法

2023-11-02

一、内存的思考题。请问运行Test函数会有什么样的结果?
第一题:

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

结果:在这里插入图片描述
在语句strcpy(str, "hello world")发生错误。引发的异常: 0xC0000005: 写入位置 0x00000000 时发生访问冲突。
分析: 由异常可知,strcpy函数试图将“hello world”写入位置0x00000000出错,这个位置是通过char *str = NULL语句,将str指向0x00000000。但我们后面又试图通过GetMemory(str),使用malloc()为str分配大小为100字节的动态空间。但通过结果来看,str的指向没有改变,即现在str指针指向的空间大小为0,而strcpy(str, "hello world")试图将12个字节的hello world写入空间大小为0的内存中,所以出错。

进一步分析错误原因: 我们在GetMemory()函数添加语句:printf("p 指向的首地址 %p", p);

void GetMemory(char* p)
{
	p = (char*)malloc(100);
	printf("p 指向的首地址 %p", p);	  //查看p申请到的动态空间的首地址
}
void Test(void)
{
	char* str = NULL;
	GetMemory(str);
	strcpy(str, "hello world");
	printf("%s", str);
}
输出结果:
p 指向的首地址 00CF4B48

有结果我们可知,哪里malloc确实为p申请了一块空间。那为什么str还指向NULL呢?原因是实参与形参之间的值传递是单向的只能由实参传给形参(即str->p),而不能由形参传给实参(p->str)。
要修改该程序很简单,既然p已经申请到了一块空间,我们只需要使用p即可,但p是局部变量,GetMemory(char* p)结束后,p也被释放了。那么我们只需在GetMemory(char* p)中返回p就好了。
修改后的程序如下::

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

输出:hello world

第二题:

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

运行结果:烫烫烫烫烫烫庚?
结果出现了乱码。
分析
“hello world”这个字符串在GetMemory函数中定义的,函数执行结束后该字符串的空间会被释放,该函数传回该字符串的首地址,但在main函数,该首地址已经不指向“hello world”这个字符串,所以str即使得到了原来存放该字符串的地址首地址,但已经无法指向该字符串,因为它已经被释放(删除)了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于内存的编程题,对异常: 0xC0000005 的分析以及解决办法 的相关文章

  • 集成学习5-Xgboost原理与调参

    github地址 DataScicence欢迎star 集成学习4 前向分步算法与GBDT 原理与案例 集成学习3 Boosting的原理和案例 集成学习2 bagging的原理与案例分析 集成学习1 投票法的原理和案例分析 Xgboost
  • CTF REVERSE练习之病毒分析

    首先介绍两个知识点 在后面的实验中运用到的 1 7Zip 7 Zip 是一款开源软件 我们可以在任何一台计算机上使用 7 Zip 包括用在商业用途的计算机 7 Zip 适用于 Windows 7 Vista XP 2008 2003 200
  • AS ERROR: x86 emulation currently requires hardware acceleration!报错解决傻瓜教程~

    最近学习android开发 一直用的是真机测试 从来没想过还要用到又慢又占内存的虚拟机 不过最近学到的一个章节要用到平板测试 没有平板的话就只能用AS创建虚拟机了 如何创建虚拟机的方法我在这里就不赘述了 这里主要介绍用AS运行虚拟机时遇到的

随机推荐

  • 解决Kali的Firefox浏览器不能正常使用

    原因 kali网卡没有分配IP 解决办法
  • (技术点)谈谈那些I/O方式----BIO、NIO、AIO

    一 事件分离器 要使用IO 就要说到事件分离器 在IO读写时 将IO请求与读写操作分离调配进行 需要用到事件分离器 事件分离器对象可以将来自事件源的IO时间分离出来 并分发到对应的read write时间处理器 Event Handler
  • React——组件的组合与交互

    组件的组合与交互 组合组件的构建 组合多个上述定义的 Box 组件 形成 Boxes 组件 并完成 属性 值的传递 lt 注 多个相同子组件时 每个子组件需要有唯一 key 值 gt 建立 Boxes 类组件 内含多个 Box组件 impo
  • post sql 数据库启动失败原因-记录

    打开服务 查看进程 若还有存活进程 杀掉相关post gres 相关的 重启服务 ok
  • windows软件或程序服务开机自启动的四种方式

    目录 方式一 1 脚本类型1 放入原脚本的快捷方式 脚本类型的 2 脚本类型2 自己写脚本 指向原服务路径 服务或软件类型的 方式二 添加任务计划方式 1 打开计算机管理 2 创建任务 添加任务名称和描述 根据需要随便填写 3 新建触发任务
  • 简单几何图形的识别与标记(opencv)

    一 实现目标 手绘简单几何图形 拍照后处理可识别并标记图形相应关键点 直线 识别并标记始末点 三角形 识别并标记三个角点 矩形 识别并标记四个角点 二 实现流程 通过Python与OpenCV进行编程 采用了获取图形角点数量的方式来识别图形
  • 3-1 客户评级

    某电商要对平台上客户进行评级 按客户的月平均消费情况进行评级 规则如下 输入年度的消费额 根据上表的月平均消费情况输出相应的 数 输入格式 输入年度消费额 输出格式 相应的 数 输入样例 在这里给出一组输入 例如 25000 输出样例 在这
  • nginx热备配置

    nginx热备是指主服务器发生宕机 或者其他原因导致服务不可用时启用备用服务器继续提供服务 下面来看看nginx是怎么配置的 upstream backend server 127 0 0 1 9001 主服务器 server 127 0
  • Ubuntu18.04 LTS下安装Clang

    Ubuntu18 04 LTS下安装Clang 一 在新系统后Ubuntu18 04 LTS下安装Clang会出现依赖缺失的问题 但一步步安装之后依旧是缺失依赖无法安装 正在读取软件包列表 完成 正在分析软件包的依赖关系树 正在读取状态信息
  • 【ML】介绍 PandasAI:生成式 AI Python 库

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • pm2查看、重启服务和日志

    简单科普 SSH 是一种网络协议 用于计算机之间的加密登录 PM2 是一个守护进程管理器 它将帮助您管理和保持应用程序在线 1 ssh远程登录 ssh hostAddress 通过输入密码 成功会登录到对应主机 如果失败会被拒绝 2 pm2
  • CSS基础学习--25 border(边框)进阶

    一 边框常见属性 border radius box shadow border image 属性 说明 CSS border image 设置所有边框图像的速记属性 3 border radius 一个用于设置所有四个边框 半径属性的速记
  • 15【背景 渐变色】

    26 背景 26 1 背景颜色 background color 属性定义了元素的背景颜色 background color 颜色值 一般情况下元素背景颜色默认值是 transparent 透明 我们也可以手动指定背景颜色为透明色 back
  • 如何做出领导满意的测试报告?Parasoft自动化软件测试数据管理了解一下

    大家在做自动化测试时是如何管理测试数据的呢 测试情况是如何实时把控的呢 对于领导来说 需要的是一份报告 而对于开发测试人员 这份数据报告的内容和形式就非常重要 这里为大家介绍一款专门针对代码级开发测试的数据管理平台 Parasoft DTP
  • HCIP笔记

    HCIP笔记 IERS OSPF协议基础 基于HCIA笔记 链路状态路由协议 OSPF的一些补充 RIP的不足 RIP是基于距离矢量算法的路由协议 RIP协议的组播地址为224 0 0 9 存在收敛速度慢 度量值不科学 扩展性差问题 互联网
  • 物联网毕设分享 火灾报警系统设计与实现

    文章目录 1 简介 2 绪论 2 1 课题背景与目的 3 烟雾传感器介绍 3 1 类型 3 2 MQ系列传感器介绍 3 3 模块介绍 4 系统设计 4 1 自诊断故障报警功能 4 2 烟雾浓度显示 4 3 烟雾报警功能 4 4 防止报警器误
  • 性能测试的方法及步骤

    一 测试方向 总体方向 性能效率测试是通过站在用户体验的角度 使用专业的负载生成设备 在性能模型的基础上验证系统是否能够达到用户提出的性能指标 是否符合用户文档中对系统设计时的性能关注点 在系统正常交互量及峰值交互量的情况下发现系统中存在的
  • Python基础:按位异或 ^ ,按位或

    前言 文的文字及图片来源于网络 仅供学习 交流使用 不具有任何商业用途 版权归原作者所有 如有问题请及时联系我们以作处理 PS 如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http t cn A6Zvjdun 使用按位异或
  • JDK8 JVM参数与实际环境中的优化配置实践

    如何配置我们的JVM呢 首先我们需要知道JVM的参数有哪些 然后根据这些参数的意义去分析自己的程序的JVM需要的配置 可以事先做一些尝试 再逐步调优 这个调优也是一个过程 没有足够的经验而做到一步到位是一件很困难的事情 事情是一点点做的 不
  • 关于内存的编程题,对异常: 0xC0000005 的分析以及解决办法

    一 内存的思考题 请问运行Test函数会有什么样的结果 第一题 void GetMemory char p p char malloc 100 void Test void char str NULL GetMemory str strcp