人人都写过的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.mzph.cn/news/724739.shtml

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

相关文章

Python爬虫:http和https介绍及请求

HTTP和HTTPS 学习目标&#xff1a; 记忆 http、https的概念和区别记忆 浏览器发送http请求的过程记忆 http请求头的形式记忆 http响应头的形式了解 http响应状态码 1 为什么要复习http和https 在发送请求&#xff0c;获取响应的过程中 就是发送http或https的请求&#xff0c…

DMA 链表模式(LLI)深度解析

在进行一次 DMA 读或者写的时候&#xff0c;可以配置多个链表&#xff0c;从而当一个链表的数据传输完成时&#xff0c;会跳到下一个链表的起始地址&#xff0c;并继续传输数据&#xff0c;直到链表的下一个地址为 0。如果 DMA 使能了完成中断&#xff0c;则当 DMA 发送或者接收…

程序计数器介绍

程序计数器是计算机处理器中的寄存器&#xff0c;它包含当前正在执行的指令的地址(位置)。当每个指令被获取&#xff0c;程序计数器的存储地址加一。在每个指令被获取之后&#xff0c;程序计数器指向顺序中的下一个指令。当计算机重启或复位时&#xff0c;程序计数器通常恢复到…

java微服务技术选型,Java学习的三个终极问题及学习路线规划

前言 在网络技术中基于浏览器的B/S结构无论在PC端还是手机端都充当着至关重要的角色。 PC端自不必说&#xff0c;手机中很多应用虽然是以APP的形式存在&#xff0c;但它采用的还是B/S结构。如今日头条、微信的朋友圈等&#xff0c;这些应用在内部封装了浏览器&#xff0c;后端…

宠物的异味,用空气净化器可以解决吗?宠物空气净化器品牌推荐

养猫的人都了解&#xff0c;一个养猫家庭的环境卫生和气味问题与主人的关系密切相关。主人的勤劳程度和对卫生的重视程度直接影响着家中的气味。尽管主人通常会经常更换猫砂&#xff0c;但有时候仍然会存在一些难闻的气味。事实上&#xff0c;忙碌的猫主人可能会因为没有足够的…

MySQL Strict Mode is not set for database connection ‘default‘

在使用 DJango 框架执行迁移文件的命令时&#xff0c;可以看到出现如下警告&#xff1a; (ll_env) D:\workspace\workspace-mengll\learning-log>python manage.py migrate System check identified some issues: WARNINGS: ?: (mysql.W002) MySQL Strict Mode is not set …

【yolov8自带脚本划分数据集】yolov8自己数据集训练

1. 命令 ultralytics.data.utils.autosplit(pathDATASETS_DIR / coco8/images, weights(0.9, 0.1, 0.0), annotated_onlyFalse)from ultralytics.data.utils import autosplitautosplit( path"path/to/images",weights(0.9, 0.1, 0.0), # (train, validation, test)…

利用Python爬取高德地图全国地铁站点信息

利用Python中的requests库进行地铁站点信息的获取,同时将数据保存在本机excel中 # 首先引入所需要的包 import requests from bs4 import BeautifulSoup import pandas as pd import json# 发送 GET 请求获取网页内容 url http://map.amap.com/subway/index.html response r…

腾讯云服务器99元一年是真的吗?又降价,现在只要61元

腾讯云服务器99元一年是真的吗&#xff1f;又降价&#xff0c;现在只要61元。腾讯云服务器多少钱一年&#xff1f;61元一年起&#xff0c;2核2G3M配置&#xff0c;腾讯云2核4G5M轻量应用服务器165元一年、756元3年&#xff0c;4核16G12M服务器32元1个月、312元一年&#xff0c;…

LiveGBS流媒体平台GB/T28181功能-集中录像存储前端设备录像回看解决方案设备录像|云端录像|实时录像说明

LiveGBS集中录像存储前端设备录像回看解决方案设备录像|云端录像|实时录像说明 1、平台概述2、视频录像2.1、设备录像2.1.1、存储位置2.1.1.1、下级硬件设备2.1.1.2、下级国标平台 2.1.2、页面操作2.1.2.1、国标设备2.1.2.1.1、查看通道2.1.2.1.1.1、设备录像 2.1.2.1.2、配置中…

分布式事务(SeataClient)

问题场景 元数据 库存 100订单记录为空下单操作 @AutowiredRestTemplate restTemplate;/*** 下单** @return*/@Transactional // 开启事务 异常后触发数据库回滚操作@Overridepublic Order create(Order order) {// 插入订单orderMapper.insert(order);// 扣减库存 MultiValu…

前缀和+哈希表:联手合击Leetcode 560.和为k的子数组

题目 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,1], k 2 输出&#xff1a;2示例 2&#xff1a; 输入&#xff1a;nums [1,2…

IP劫持的危害及应对策略

随着互联网的发展&#xff0c;网络安全问题日益凸显&#xff0c;其中IP劫持作为一种常见的网络攻击手段&#xff0c;对个人和企业的信息安全造成了严重的威胁。IP数据云将分析IP劫持的危害&#xff0c;并提出相应的应对策略。 IP地址查询&#xff1a;IP数据云 - 免费IP地址查询…

Android开发经典实战,Android面试题目

关于Android的近况 大家都知道&#xff0c;今年移动开发不那么火热了&#xff0c;完全没有了前两年Android开发那种火热的势头&#xff0c;如此同时&#xff0c;AI热火朝天&#xff0c;很多言论都说Android不行了。其实不光是Android&#xff0c;iOS也有类似的言论。 那么到底…

java多线程编程(四)-----线程池

一.线程池的介绍 java中的池是非常重要的思想方法&#xff0c;比如内存池&#xff0c;进程池&#xff0c;连接池&#xff0c;常量池等等。本篇重点介绍java中的线程池。这里的这些池的概念都是一样的&#xff0c;比如做饭的时候&#xff0c;有烧水&#xff0c;切菜&#xff0c…

[动态规划]---part2

前言 作者&#xff1a;小蜗牛向前冲 专栏&#xff1a;小蜗牛算法之路 专栏介绍&#xff1a;"蜗牛之道&#xff0c;攀登大厂高峰&#xff0c;让我们携手学习算法。在这个专栏中&#xff0c;将涵盖动态规划、贪心算法、回溯等高阶技巧&#xff0c;不定期为你奉上基础数据结构…

【学习】torchvision.datasets.ImageFolder()

在分类任务中&#xff0c;数据集文件存储往往是如下形式&#xff1a; - train- class1- image1.jpg- image2.jpg...- class2- image1.jpg- image2.jpg......此时&#xff0c;我们想要获取图片和标签&#xff0c;标签即为文件名&#xff08;class1、class2…&#xff09; 可以使…

【DevSecOps】2024 年需要警惕的 10 大 Web 应用程序安全威胁

【DevSecOps】2024 年需要警惕的 10 大 Web 应用程序安全威胁 由于 2023 年出现了许多创新,我们之前所了解的许多内容都发生了巨大变化;随着其中一些重大变化,威胁格局也发生了转变,一些旧威胁减少了,一些新威胁增加了。 技术每天都在不断变化,当我们谈论技术和相关威胁…

AI大模型:创新前沿的探索之路

AI大模型一直被视为人工智能领域的创新前沿&#xff0c;它们拥有强大的计算能力和学习能力&#xff0c;能够在各种复杂的任务中表现出色。随着技术的不断进步&#xff0c;越来越多的研究者和企业开始投入到AI大模型的研发和应用中&#xff0c;希望能够探索出更多的可能性。 在…

Tomcat基础与Nginx的动静分离

一、TOMCAT基础功能 &#xff08;一&#xff09;自动解压war包 在配置文件中讲到&#xff0c;当接受到请求后&#xff0c;会匹配符合要求的Host&#xff0c;在配置文件中的Host只有一个&#xff0c;且规定了自动解压war包 自动解压war包 .war&#xff1a;WebApp打包,类zip格…