当前位置: 首页 > news >正文

动态内存管理-传值调用错题解析

首先我们来看这个错误代码 

 

首先我们看代码逻辑,首先main函数调用test,test接收的是void类型,设置一个指针变量,指向null,传递给get函数,也就是传递一个空指针给getmemory函数,这个函数接收了,然后进行运算。

接下来我们进行分析代码的错误逻辑。

为什么不取地址是错误的呢,

  1. 传递地址(指针的指针): 当你传递 &strstr 的地址)给函数时,你是在告诉函数你想要操作的是 str 变量的内存地址本身。这允许函数直接修改 str 变量的值,或者使用 str 变量的地址进行其他操作。
  2. 传递指针(不取地址): 当你传递 str(指向 char 的指针)给函数时,你是在告诉函数你想要操作的是 str 指向的字符串。函数可以通过 str 指针访问和修改字符串的内容,但不会直接修改 str 指针本身的值。

这样会导致什么情况呢,就是内存销毁的问题,你这个函数传递的时候,传递的是指针,不是指针的地址。那么此时就会产生一种情况那就是,getmemory函数运算结束,这个函数进行了销毁。

因为他调用结束之后,函数会进行销毁,strcpy函数想拷贝到开辟的空间里面,OK!找不到空间了,因为进行了销毁。

什么意思呢,可以理解为,

张三,有一天忙碌完,不想回家了,在公司楼下开了个酒店住进去了,哎,很不错,告诉李四,我住的209房间特别好,你有空可以去试试。第二天李四也累了,那我也去了,我到地方我就记得209房间,但是张三的209房间已经退房了,那我肯定进不去,我非得进去,那就被保安打一顿。

你这里也是这样,你这里 想拷贝字符创,那可以没问题。关键点在于你这里传递的是数值,他不是地址,那数值的话,函数创建了,然后运行结束进行销毁。你自然找不到房间号。你这里要是传递的是空间的地址,那我可以直接去你的地址进行操作拷贝,你也不需要进行返回什么的,哪怕进行销毁了,那也没事。

1.因为这里传参传递的是数值,函数返回的时候进行了函数的销毁,从而导致非法访问

这里的意思 应该是把100个字节放到str里面去 但是传值调用是不行的 会导致有问题

正确的处理应该是什么呢

我们可以把str取地址,传参传的是地址,然后因为本身str已经是指针,我们采取用二级指针的方式进行接收,也就是指向的是指针的地址,

修改为正确代码1

此时就可以完成任务了 

修改为正确代码2

当然 不喜欢二级指针 也可以进行数值的接受 也就是char*

找个数值进行接收,找个数值进行接收,那就是有返回类型,我们采取的返回类型是char*类型,因为这里是拷贝字符串。接收返回值也是一样的。

提示一下,所以其实不传参也是可以的

图解 

http://www.lryc.cn/news/325534.html

相关文章:

  • Java特性之设计模式【装饰器模式】
  • Leetcode算法题笔记(2)
  • 二手车交易网站|基于JSP技术+ Mysql+Java+ B/S结构的二手车交易网站设计与实现(可运行源码+数据库+设计文档)
  • lora-scripts 训练IP形象
  • Acwing 503. 借教室
  • 吴恩达深度学习笔记:浅层神经网络(Shallow neural networks)3.1-3.5
  • Linux设备驱动开发 - 三色LED呼吸灯分析
  • 开发者的瑞士军刀:DevToys
  • 【vue3.0】实现导出的PDF文件内容是红头文件格式
  • 【CSP试题回顾】202012-2-期末预测之最佳阈值(优化)
  • docker学习笔记 三-----docker安装部署
  • FastAPI+React全栈开发02 什么是FARM技术栈
  • C#程序结构详解
  • linux 清理空间
  • C语言:给结构体取别名的4种方法
  • 今天聊聊Docker
  • 【C语言】结构体
  • Git基础(24):分支回退
  • 复试专业前沿问题问答合集1
  • C++标准库中提供的用于处理正则表达式的类std::regex
  • .NET Core 服务实现监控可观测性最佳实践
  • AI基础知识扫盲
  • 分布式系统面试全集通第一篇(dubbo+redis+zookeeper----分布式+CAP+BASE+分布式事务+分布式锁)
  • Prompt-RAG:在特定领域中应用的革新性无需向量嵌入的RAG技术
  • 线性代数 - 应该学啥 以及哪些可以交给计算机
  • 力扣面试150 Pow(x, n) 快速幂 负指数
  • 连接navicat报错2059 解决办法
  • Unity-UGUI系统
  • 配置AC和AP上报KPI指标信息实验
  • 深度学习Trick