人人都写过的6个bug

大家好,我是知微。

程序员写bug几乎是家常便饭,也是我们每个人成长过程中难以避免的一部分。

为了缓解这份“尴尬”,今天想和大家分享一些曾经都会遇到过的bug,让我们一起来看看这些“经典之作”。

1、数组越界

#include <stdio.h>int main() {int array[5];array[5] = 42;printf("幸运数字是:%d\n", array[5]);return 0;
}
  • 在这段代码中,我们声明了一个包含5个整数的数组,但随后我们尝试给数组的第六个元素(array[5])赋值。
  • 在C语言中,数组的索引是从0开始的,所以实际上我们只有array[0]array[4]这五个有效的元素。
  • 因此,尝试给第六个元素赋值会导致数组越界。

这种越界行为可能会导致程序崩溃、产生未定义的行为,甚至可能影响到程序的其他部分。

2、忘记给变量赋初值

忘记给变量赋初值是一个常见的编程错误,有时候它会导致程序运行时出现意外的行为。让我们来看一个例子:

#include <stdio.h>int main() {int a = 5;int b;printf("a的值是:%d\n", a);printf("b的值是:%d\n", b);return 0;
}
  • 在这段代码中,我们给变量a赋了初值为5,但变量b却没有被初始化。

  • 在C语言中,未初始化的局部变量会包含一些随机的垃圾值,这样在使用它们的时候就会出现问题。

  • 修复这个问题的方式是给变量b一个明确的初值,如:

int b = 0;

或者根据实际需求选择一个适当的初值,这样可以避免在程序中使用未初始化的变量而引发的问题。

3、条件判断写成赋值

如果把 = 写成了 ==,本来是判断相等的,结果变成了赋值。条件永远成立,导致程序执行了不该执行的分支。

#include <stdio.h>int main() {int x = 10;if (x = 5) {printf("条件成立!\n");} else {printf("条件不成立!\n");}return 0;
}
  • 在这个例子中,条件判断中使用了单个等号(=)而不是比较相等的双等号(==)。
  • 这将导致x被赋值为5,然后条件判断始终为真,执行了不该执行的分支。

4、内存未释放或者重复释放

a、内存未释放
#include <stdlib.h>int main() {int *arr = malloc(10 * sizeof(int));// 忘记释放内存// free(arr);return 0;
}
  • 在这个例子中,我们使用malloc分配了一块内存来存储整数数组,但是忘记了在程序结束前释放这块内存。
  • 这样会导致内存泄漏,即分配的内存无法被回收,最终可能耗尽系统的可用内存。
b、重复释放内存
#include <stdlib.h>int main() {int *arr = malloc(10 * sizeof(int));// 重放释放内存free(arr);free(arr);return 0;
}
  • 在这个例子中,我们错误地尝试释放相同的内存块两次。
  • 这种情况可能导致程序崩溃或者其他未定义的行为,因为系统会认为这块内存已经被释放,再次释放它会产生问题。

看到这里有人会有疑问,谁会这么傻,在一个地方free两次,我free一次不就好了。

的确,我们在写代码的时候,基本不会出现例子中这种情况。但是我接下来要说的场景,还是很有可能发生的。

假如在a文件中申请了动态内存,指针arr指向这块内存。b文件free(arr), 然后某次不小心,在c文件中又free(arr),这种情况就会导致重复释放内存了。

5、强制类型转换

#include <stdio.h>int main() {int a = 5;float b = 2.5;// 无名的类型强制可能导致精度损失int result = (int)b + a;printf("结果是:%d\n", result);return 0;
}
  • 在这个例子中,我们试图将浮点数 b 强制转换为整数,并与整数 a 相加。这可能导致精度损失,因为浮点数可能包含小数部分,但在强制转换时小数部分将被丢弃,导致结果不准确。

  • 在进行类型转换时,需要仔细考虑可能发生的精度损失,并确保结果仍然符合预期。如果可能会有精度损失,最好考虑使用更合适的数据类型或者进行四舍五入等操作以确保精度。

6、使用未初始化的指针

未初始化的指针可能包含随机的内存地址,导致未定义的行为。

#include <stdio.h>int main() {int *ptr;// 使用未初始化的指针*ptr = 42;printf("值:%d\n", *ptr);return 0;
}
  • 在这个例子中,指针 ptr 没有被初始化,但却尝试通过它来访问内存并赋值。

  • 这可能导致程序崩溃或者产生不可预测的结果,因为指针 ptr 实际上指向了一个未知的内存地址。

  • 为了避免这个问题,始终确保在使用指针之前对其进行初始化。例如,通过分配内存或将其指向一个已有的变量:

int value = 42;
int *ptr = &value;  // 初始化指针,指向变量 valueprintf("值:%d\n", *ptr);
  • 或者,如果不想立即初始化,可以将指针设置为 NULL(空指针),然后在需要时再进行初始化:
int *ptr = NULL;  // 初始化为空指针// 在需要时分配内存或指向已有变量
// ...printf("值:%p\n", (void *)ptr);  // 注意:%p 用于打印指针的地址
  • 通过这样的方式,可以确保在使用指针之前,它已经指向了有效的内存地址,避免了潜在的未定义行为。

​以上就是本文的全部内容了​!

📢欢迎各位 👍点赞 ⭐收藏 📝评论,如有错误请留言指正,非常感谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/270316.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【单片机学习的准备】

文章目录 前言一、找一个视频是二、画图软件三、装keil5 仿真protues总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 项目需要&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、找一个视频是 https://www.b…

MongoDB聚合运算符:$count

文章目录 语法使用举例在$group阶段中使用在$setWindowFields阶段使用 $count聚合运算符返回分组中文档的数量。从5.0开始支持。 语法 { $count: { } }$count不需要参数 使用 $count可以用于下列聚合阶段&#xff1a; $bucket$bucket$group$setWindowFields 在$group阶段中…

基于springboot+vue的校园网上店铺

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

MySQL 学习笔记(基础篇 Day1)

「写在前面」 本文为黑马程序员 MySQL 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。 目录 0 课程介绍 1 MySQL 概述 1.1 数据库相关概念 1.2 MySQL 数据库 2 SQL 2.1 SQL 通用语法 2.2 SQL 分类 2.3 DDL 2.4 图形…

计算机网络-第2章 物理层

本章内容&#xff1a;物理层和数据通信的概念、传输媒体特点&#xff08;不属于物理层&#xff09;、信道复用、数字传输系统、宽带接入 2.1-2.2 物理层和数据通信的概念 物理层解决的问题&#xff1a;如何在传输媒体上传输数据比特流&#xff0c;屏蔽掉传输媒体和通信手段的差…

【python高级编程教程】笔记(python教程、python进阶)第三节:(1)多态与鸭子类型(Polymorphism and Duck Typing)

参考文章1&#xff1a;【比刷剧还爽】清华大佬耗时128小时讲完的Python高级教程&#xff01;全套200集&#xff01;学不会退出IT界&#xff01; 参考文章2&#xff1a;清华教授大力打造的Python高级核心技术&#xff01;整整100集&#xff0c;强烈建议学习&#xff08;Python3…

Python 开发图形界面程序

用 Python 语言开发图形界面的程序&#xff0c;有2种选择&#xff1a; Tkinter 基于Tk的Python库&#xff0c;这是Python官方采用的标准库&#xff0c;优点是作为Python标准库、稳定、发布程序较小&#xff0c;缺点是控件相对较少。 PySide2/PySide6 基于Qt 的Python库&#x…

JMeter VS RunnerGo :两大主流性能测试工具对比

说起JMeter&#xff0c;估计很多测试人员都耳熟能详。它小巧、开源&#xff0c;还能支持多种协议的接口和性能测试&#xff0c;所以在测试圈儿里很受欢迎&#xff0c;也是测试人员常用的工具&#xff0c;不少企业也基于JMeter建立起自己的自动化测试能力&#xff0c;提升工作效…

VMware虚拟机安装Linux

1.新建虚拟机 2. 安装操作系统 等待 选择中文 点软件选择 选择下面的GNOME桌面 禁用KDUMP 点进安装位置&#xff0c;点完成就可以了 网络连接&#xff0c;右上角打开 开始安装&#xff0c;输入ROOT密码&#xff0c;创建用户 点击重启&#xff0c;等待 重启完成之后出现下面的界…

javaWebssh在线授课辅导系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh在线授课辅导系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用 B/S模式开发。开发环境为TOMCAT7.…

PaddleOCR CPU 文本文字识别 docker部署

需求&#xff1a; 需要把所有滑块图片的数据文字提取出来 启动服务 mkdir paddle cd paddle docker run -itd --name ppocr -v $PWD:/paddle --networkhost -it registry.baidubce.com/paddlepaddle/paddle:2.1.3-gpu-cuda10.2-cudnn7 /bin/bash docker exec -it ppocr bash …

重装显卡驱动记录

重装显卡驱动记录 任务记录现状描述执行情况 任务 晚上回来&#xff0c;开电脑&#xff0c;发现总是进不去系统&#xff08;这个情况我经常见&#xff09;&#xff0c;但偶尔进系统&#xff0c;识别不了我的外接屏&#xff08;这个第一次见&#xff09;。来来回回重启了1h多了…

JVM内部世界(内存划分,类加载,垃圾回收)

&#x1f495;"Echo"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;JVM内部世界(内存划分,类加载,垃圾回收) 关于JVM的学习主要掌握三方面: JVM内存区的划分类加载垃圾回收 一.JVM内存区的划分 当一个Java进程开始执行时,JVM会首先向操作系统申…

18 easy 104. 二叉树的最大深度

方法1&#xff1a;深度优先遍历 //给定一个二叉树 root &#xff0c;返回其最大深度。 // // 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 // // // // 示例 1&#xff1a; // // // // // // //输入&#xff1a;root [3,9,20,null,null,15,7…

16:00面试,16:06就出来了,问的问题过于变态了。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到2月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

【茶话数据结构】查找最短路径——Dijkstra算法详解(保姆式详细图解,步步紧逼,保你学会)

&#x1f4af; 博客内容&#xff1a;【茶话数据结构】查找最短路径——Dijkstra算法详解 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f989;所属专栏&#xff1a;数据结构笔记 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前端&#xff0c;专注基础和实…

数据结构之顺序表及其实现!

目录 ​编辑 1. 顺序表的概念及结构 2. 接口的实现 2.1 顺序表的初始化 2.2 检查顺序表容量是否已满 2.3 顺序表的尾插 ​编辑 2.4 顺序表的尾删 2.5 顺序表的头插 2.6 顺序表的头删 2.7 顺序表在pos位置插入 2.8 顺序表在pos位置删除 2.9 顺序表的查找 2.10 顺…

【硬件设计】光耦HCNR200基本原理及应用(资料摘抄)

【仅作自学记录&#xff0c;不出于任何商业目的。如有侵权&#xff0c;请联系删除&#xff0c;谢谢&#xff01;】 本文摘抄翻译自&#xff1a; https://docs.broadcom.com/wcs-public/products/application-notes/application-note/331/6/av02-1333en-an_5394-16jul10.pdfhtt…

静态住宅代理IP选择攻略

静态住宅代理IP&#xff0c;是一种在网络通信过程中提供固定IP地址的代理服务。与动态代理IP相比&#xff0c;静态代理IP提供的是持久且不变的IP地址。这种稳定性使得静态代理IP在需要长期稳定网络身份的场景中&#xff0c;如跨境电商/社媒养号、网络监控、品牌保护、长期数据爬…

【web安全】实战 批量横扫springboot命令执行漏洞

天命&#xff1a;这次目标批量横扫&#xff0c;但是没完全成功&#xff0c;也没完全失败 步骤1&#xff1a;磨刀准备 这次先针对漏洞来寻找目标&#xff0c;所以寻找这种 springboot 的目标 利用CVE漏洞&#xff0c;进行命令执行攻击 先找靶场训练一波&#xff0c;叠加反弹sh…