人人都写过的6个bug

news2024/11/25 6:45:14

大家好,我是知微。

程序员写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;  // 初始化指针,指向变量 value

printf("值:%d\n", *ptr);
  • 或者,如果不想立即初始化,可以将指针设置为 NULL(空指针),然后在需要时再进行初始化:
int *ptr = NULL;  // 初始化为空指针

// 在需要时分配内存或指向已有变量
// ...

printf("值:%p\n", (void *)ptr);  // 注意:%p 用于打印指针的地址
  • 通过这样的方式,可以确保在使用指针之前,它已经指向了有效的内存地址,避免了潜在的未定义行为。

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

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

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

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

相关文章

如何给Vue项目配置好一个nginx.conf文件?

如何给Vue项目配置好一个nginx.conf文件&#xff1f; 一般前端项目中&#xff0c;会有一个docker/nginx/nginx.conf文件&#xff0c;用于配置DockerFile配置等。 那么&#xff0c;如何给项目写好一个nginx.conf文件&#xff0c;以DockerFile为例&#xff1a; # 使用 Node.js …

SpringBoot+Mybatis-plus+shardingsphere实现分库分表

SpringBootMybatis-plusshardingsphere实现分库分表 文章目录 SpringBootMybatis-plusshardingsphere实现分库分表介绍引入依赖yaml配置DDL准备数据库ds0数据库ds1 entitycotrollerserviceMapper启动类测试添加修改查询删除 总结 介绍 实现亿级数据量分库分表的项目是一个挑战…

第三百八十五回

文章目录 1.概念介绍2.使用方法3.示例代码 我们在上一章回中介绍了Snackbar Widget相关的内容,本章回中将介绍TimePickerDialog Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1.概念介绍 我们在这里说的TimePickerDialog是一种弹出窗口&#xff0c;只不过窗口的内容…

Windows10 安装Neo4j流程

1、下载并安装ava运行环境 官网链接&#xff08;需要注册Oracle账号&#xff09;&#xff1a;https://www.oracle.com/java/technologies/downloads/ 根据自己Neo4j版本确认需要的JDK版本 百度网盘链接&#xff1a; 链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/…

Unity 整体界面淡入淡出效果

在Unity中&#xff0c;如果我们要实现控制多个组件同时淡出&#xff0c;同时淡入的效果&#xff0c;可以使用DOTween插件实现。 如图&#xff0c;一个页面中带有背景&#xff0c;一张图片&#xff0c;一个文本&#xff0c;一个滑动条。 要实现以上界面的整体淡入淡出&#xff…

企业内部培训考试系统在线考试都用到了哪些防作弊技术?

企业内部培训考试系统在线考试功能采用了多种技术手段来防止作弊行为&#xff0c;确保考试的公平性和有效性&#xff0c;具体如下&#xff1a; 1. 人脸识别验证&#xff1a;在考试开始前&#xff0c;考生需要进行人脸识别核验。系统会根据考生的姓名和身份证号实时采集人脸与公…

Python 弱引用全解析:深入探讨对象引用机制!

目录 前言 弱引用的概述 弱引用的原理 使用 WeakRef 类创建弱引用 使用 WeakValueDictionary 类创建弱引用字典 实际应用场景 1. 解决循环引用问题 2. 对象缓存 总结 前言 在Python编程中&#xff0c;弱引用&#xff08;Weak Reference&#xff09;是一种特殊的引用方式…

Android开发技巧,最详细的解释小白也能听懂

今天&#xff0c;跟大家聊聊&#xff0c;Framework开发的那些事。 系统应用开发&#xff0c;现在来说&#xff0c;已经开始脱离系统&#xff0c;单独拿出来开发&#xff0c;系统定制接口&#xff0c;已提供给应用调用&#xff0c;用来增强功能。 原生的桌面&#xff0c;拨号&…

【Java面试/24春招】技术面试题的准备

Spring MVC的原理 Mybatis的多级缓存机制 线程池的大小和工作原理 上述问题&#xff0c;我们称为静态的问题&#xff0c;具有标准的答案&#xff0c;而且这个答案不会变化&#xff01; 如果没有Spring&#xff0c;会怎么样&#xff1f;IOC这个思想是解决什么问题&#xff1f…

2024年腾讯云发红包了,可用于抵扣订单金额,你们领了吗?

在2024年腾讯云新春采购节优惠活动上&#xff0c;可以领取新年惊喜红包&#xff0c;打开活动链接 https://curl.qcloud.com/oRMoSucP 会自动弹出红包领取窗口&#xff0c;如下图&#xff1a; 腾讯云2024新春采购节红包领取 如上图所示&#xff0c;点击“领”红包&#xff0c;每…

Android学习笔记在互联网上火了,Android资深架构师分享学习经验及总结

本篇将由 环境搭建、实现原理、编程开发、插件开发、编译运行、性能稳定、发展未来 等七个方面&#xff0c;对当前的 React Native 和 Flutter 进行全面的分析对比&#xff0c;希望能给你更有价值的参考。 前言 移动端跨平台在经历数年沉浮之后&#xff0c;如今还能在舞台聚光…

Android开发真等于废人,历经30天

前言 回顾一下自己这段时间的经历&#xff0c;三月份的时候&#xff0c;疫情原因公司通知了裁员&#xff0c;我匆匆忙忙地出去面了几家&#xff0c;但最终都没有拿到offer&#xff0c;我感觉今年的寒冬有点冷。到五月份&#xff0c;公司开始第二波裁员&#xff0c;我决定主动拿…

【《高性能 MySQL》摘录】第 9 章 操作系统和硬件优化

文章目录 9.1 什么限制了MySQL的性能9.2 如何为 MySQL 选择 CPU9.2.1 哪个更好&#xff1a;更快的 CPU 还是更多的 CPU9.2.2 CPU架构9.2.3 扩展到多个CPU和核心 9.3 平衡内存和磁盘资源9.3.1 随机 I/O 和顺序 I/O9.3.2 缓存&#xff0c;读和写9.3.3 工作集是什么9.3.4 找到有效…

QT 5.14.2版本 MAC环境安装部署流程

下载地址 &#xff1a;https://download.qt.io/archive/qt/5.14/5.14.2/ 下载完成后如下 双击打开安装&#xff0c;会弹出验证&#xff0c;等待验证完成 点击next 下一步&#xff0c;开始安装 如果你还没有qt账号&#xff0c;则先注册账号 &#xff0c;注册完后输入账号&#…

【报错】PyCharm安装插件时出现Error loading package list:Unexpected end of file from server

Q PyCharm安装插件时出现 Error loading package list:Unexpected end of file from server提示窗口。 A 将Python Interpreter——>——>Manage Repositories中无法用的源删掉 刷新

Xilinx 7系列 FPGA硬件知识系列(三)—— Bank划分及引脚定义

目录 用户Bank BANK 0&#xff08;配置BANK&#xff09; BANK 14&#xff08;HR BANK&#xff09; BANK 116/117/118&#xff08;GTX BANK&#xff09; 7系列的FPGA开始才有HP BANK和HR BANK&#xff0c;UltraScale FPGA有HP BANK、HR BANK和HD BANK&#xff0c;但并不是一…

HashMap 源码解读

文章目录 一、什么是HashMap HashMap 是一种快速的查找并且插入、删除性能都良好的一种 K/V键值对的数据结构&#xff0c;key唯一&#xff0c;value允许重复它基于哈希表的 Map 接口实现&#xff0c;是常用的 Java 集合之一&#xff0c;是非线程安全的。 二、HashMap的数据结…

android开发板调试,Android程序员的春天

前言 大家好&#xff01;给大家介绍一下&#xff0c;这是我们持续更新整理的2021年最新的阿里&#xff1b;百度&#xff1b;腾讯&#xff1b;字节跳动等大厂的Android面试真题解析&#xff01; 早在2018年我们就建了第一个BAT等大厂的面试群给大家讨论面试的东西。期间累计有…

java工程师面试技巧,最新Java开发面试解答

一、前言 聊的是八股的文&#xff0c;干的是搬砖的活&#xff01; 面我的题开发都用不到&#xff0c;你为什么要问&#xff1f;可能这是大部分程序员求职时的经历&#xff0c;甚至也是大家讨厌和烦躁的点。明明给的是拧螺丝的钱、明明做的是写CRUD的事、明明担的是成工具的人…

three.js实现全景看房,一个简单实用的功能。

一、全景看房的实现步骤 要实现全景看房功能&#xff0c;可以使用Three.js结合全景图像和交互控制来创建一个交互式的全景看房场景。下面是实现全景看房的基本步骤&#xff1a; 加载全景图像&#xff1a;首先&#xff0c;需要准备全景图像&#xff0c;通常是一个360度全景图。…