ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

刷题时遇到的那些C++的”坑“

2022-07-27 19:34:47  阅读:101  来源: 互联网

标签:语句 fsanitize 遇到 代码 C++ break 循环 数组 刷题


break 与 continue

  • 在循环语句中,break只能跳出一层循环,如果外边还有一层或者该循环代码后还有代码的话只break一下后续代码还会执行,这是你想要的效果吗???
  • 循环语句中continue会跳过本次循环,但是去执行下一次循环,你确定自己的目的是这样吗???
  • switch 语句中,default的情况下往往会执行break,这个语义是不符合上边的任何一种情况,不做任何行动,break只是跳出switch语句;

内存访问越界的情况实际很容易出现,使用容器并不能避免代码本身的问题


这段代码中,本意是tmpStr如果出现非数字的话跳出循环重新开始下一轮遍历,然而,break只能跳出本层for循环,所以实际上还是以空字符串向下执行了(外层的那个{实际上是比较懒用了{}分段处理,正常该封装成函数的)。向下执行的时候已经在计划之外了,此时的我判断这种意外会崩溃在 if (tmpStr[0] == 'A')这行代码,呵呵,实际上崩溃在 std::cout << "tmpStr[i]:" << tmpStr[i] << "\t";里面了。不对啊,字符串为空这个循环内的代码按理说不会执行啊?? 这又涉及到重要知识点“有符号和无符号整型问题,无符号整型变量0-1会变成最大的正整数啊!!!”,所以这个循环就进来了呢。

数据处理一定要保持一致性

比如,一个数组我们用的时候要么保持[), 要么保持[],不然处理的一塌糊涂

数组下标最大值不能与API接口中指定数组大小的参数混淆

下标计算从0开始,涉及到数组的接口往往会指定数组的大小,千万注意下标的最大值 = 数组大小 - 1,不然小则崩溃,大则接口输出结果不稳定,十分诡异,排查去吧。。。。。。

ASAN工具一定要用起来

编译的时候CXX_FLAGS增加-fsanitize=address -fsanitize-recover=all -fsanitize=leak编译选项,则编译或者运行过程中出问题一下子就能指出代码错误的那一行,非常清晰!

标签:语句,fsanitize,遇到,代码,C++,break,循环,数组,刷题
来源: https://www.cnblogs.com/create-serenditipy/p/16526006.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有