最近在写人工智能作业的时候遇到了一点问题,就是在循环语句中对指针类型赋值出现错误,导致所有的结点的前驱指针最终指向自身。

问题描述

以下使用一个简单的示例来模拟当时出现的问题。

MyStruct 为一个自定义结构体类型,包含数据成员 val 和前驱结点 pre。首先将初始结点(0,nullptr)加入队列 Q,随后在每次循环中,用变量 fs 接收队列 Q 的队首元素并将其出队,并根据该结点生成一个新结点,该新结点 val = fs.val + 1,且将其前驱结点设为 fs 并加入到队列 Q 中。直到 fs.val >= 5 时退出循环。

struct MyStruct
{int val;MyStruct* pre;MyStruct(int v = 0, MyStruct* p = nullptr) : val(v), pre(p) {}
};int main()
{std::queue<MyStruct> Q;Q.emplace(0, nullptr);MyStruct target;while (!Q.empty()) {MyStruct fs = Q.front();Q.pop();if (fs.val >= 5) {target = fs;break;}Q.emplace(fs.val + 1, &fs);}std::cin.get();
}

如果代码运行如我们预期,最终将会得到一个 val 为 5 的结点,并且其前驱为一个 val 为 4 的结点,以此类推,形成一个 val 从 5 到 0 的链表。但事实上,最终结点之间并没有彼此相连,结点 target 的 pre 为自身。

问题原因

如果仔细观察,变量 fs 在整个循环过程中都占用同一片内存空间,而子节点的前驱结点 pre 直接指定为了 fs 的地址,那么如果 fs 的值遭到改变,即该地址的数据被改变,那么结点的前驱结点 pre 也会被改变。即下次循环执行 MyStruct fs = Q.front(); 后结点的前驱结点就遭到了改变,且指向了自身。

解放方法

由于 fs 的始终占用一片内存空间,为了防止因 fs 的数据被改变而使得结点前驱结点数据遭到改变,可以为结点的前驱结点重新开辟一片内存空间并赋予当前 fs 的数据。

循环语句中指针赋值出错相关推荐

  1. continue语句只用于循环语句中_Java之循环语句、条件判断语句(三目运算符)、break、continue...

    之前的内容只是让读者可以定义变量,输出变量等基础功能而已.这远远是不够的,今天,我们学习的内容可以帮你开始完善自己想开发的内容,在这之前我们先理解一个概念:一个表达式的返回值是布尔值的表达式称为布尔 ...

  2. continue语句可以用在switch语句和3种循环语句中_必须知道的C语言知识细节:break、continue语句区别...

    break语句.continue语句都是C语言标准规定的跳转类语句,能够实现程序无条件转向另一处执行. break和continue中在循环体中经常出现,因此必须掌握其区别,避免出错. 先复习下两种语 ...

  3. 在循环语句中,for(i=0;in;i++)和for(i=0;in;++i)有什么区别?

    2019独角兽企业重金招聘Python工程师标准>>> 程序员 代码 C(编程语言) C++ C / C++ 在循环语句中,for(i=0;i<n;i++)和for(i=0;i ...

  4. 成功解决for循环语句中,后几次循环输出数据一直全部为空

    成功解决for循环语句中,后几次循环输出数据一直全部为空 目录 解决问题 解决思路 解决方法 解决问题 for循环语句中,后几次循环输出数据一直全部为空

  5. continue语句只用于循环语句中,它的作用是什么?

    continue语句只用于循环语句中,它的作用是:跳过循环体中剩余的语句而强制进入下一次循环.continue语句只用在while.for循环中,常与if条件语句一起使用,判断条件是否成立. cont ...

  6. python里else中文意思_Python循环语句中else的用法总结

    前言 本文讨论Python的for-else和while-else等语法,这些是Python中最不常用.最为误解的语法特性之一. Python中的for.while等循环都有一个可选的else分支(类 ...

  7. [Python]循环语句中的 else 子句

    [Python]循环语句中的 else 子句 有其它编程语言经验的程序员接触到 Python 时最讶异的莫过于无所不在的 else,不仅分枝语句有,而且循环语句也有,甚至连异常处理也有.但现在我们来看 ...

  8. continue语句可以用在switch语句和3种循环语句中_Java基础复习笔记P20——break和continue...

    控制循环语句: break 和 continue break break是java语言当中的关键字,被翻译为"中断" break+";"可以成为一个单独的完整的 ...

  9. Python循环语句中的else

    Python循环语句中的else 简介 流程图 作用 简介 在while和for循环语句中都可以跟上else语句,但是与if-else判断不同.在这里,else是循环语句正常结束时才能执行的代码段,如 ...

最新文章

  1. 《江南百景图》游戏设计小思考:留边占角“小烦恼”
  2. java逆向_Java逆向基础之异常
  3. GDB调试工具使用教程(博客)
  4. 深入理解java虚拟机 - jvm高级特性与最佳实践(第三版)_JVM虚拟机面试指南:年薪30W以上高薪岗位需求的JVM,你必须要懂!...
  5. hibernate oracle查询最大值_Java大数据:Mybatis和Hibernate对比分析
  6. mimo-ofdm无线通信技术及matlab实现_智芯文库 | FPGA无线通信课程连载——扰码的原理及实现...
  7. C语言size_t类型
  8. CSS3与弹性盒布局
  9. python安装及配置
  10. html 字体图标转换工具,字体图标的制作方式
  11. Des加密后传参被特殊字符(如+)截断
  12. 沧小海基于xilinx srio核的学习笔记之第三章 xilinx srio核介绍(三)核配置
  13. 安防综合管理平台/视频资源汇聚平台
  14. 好的网站链接或文章链接(一)
  15. Linux文件系统及常用命令
  16. 查看oracle的SID
  17. Oracle 发送QQ邮件监控定时任务
  18. Spark~~SparkCore
  19. 移动平台动画设计的12个原则
  20. 基于正交投影的实时三维人体姿态估计

热门文章

  1. (转)证券行业信息化——9
  2. 信息化、数字化与数字化转型的区别
  3. 治理:没有规矩不成方圆
  4. wpf实现简易画板功能(带截取画板,签名截图等等)
  5. HDU 1570 A C(暴力)
  6. java 视图_Java 视图
  7. 微信公众号开发---nginx反向代理
  8. treelist右键菜单功能contextMenuStrip
  9. c/cpp中的对数运算的简单归纳
  10. matlab直流计算,一种基于MATLAB的直流开关振荡回路参数测量系统及计算方法与流程...