人人都写过的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;  // 初始化指针,指向变量 value

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

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库-DDL

show databases; 查询所有数据库 select database(); 查询当前数据库 use 数据库名&#xff1b; 使用数据库 creat database[if not exists] 数据库名…

成都源聚达:开抖音店铺分数需要达到多少

在数字化浪潮中&#xff0c;抖音以其独特的平台魅力吸引了无数商家入驻。但想要开设一家抖音店铺并非随意之举&#xff0c;它需要商家达到一定的评分标准。这如同参加一场考试&#xff0c;只有成绩合格者才有资格入座。那么&#xff0c;这个分数线究竟是多少呢? 据官方数据显示…

力扣hot100:560.和为K的子数组(前缀和+哈希表)

分析&#xff1a; 这个题目乍一看&#xff0c;数据大小用暴力解法大概率会超时&#xff0c;可能想用双指针&#xff0c;但是问题出现在 可能存在负数&#xff0c;也就是说即使是找到了一个答案&#xff0c;后面也可能存在负数和正数抵消&#xff0c;又是答案&#xff0c;因此不…

【Linux】文件传输工具lrzsz的安装与使用

目录 一、关于lrzsz 二、安装lrzsz 三、lrzsz的说明及使用 1、上传命令rz 2、下载命令sz 一、关于lrzsz 在开发的过程中&#xff0c;经常遇到 需要在 Linux 和 Windows 之间上传下载文件的情况 这时&#xff0c;一般都是使用 FTP 或者 WinSCP 工具进行上传下载, 虽然也能…

用ChatGPT计算植被归一化指数NDVI并出图的详细教程

用ChatGPT结合GIS计算植被归一化指数NDVI出图教程 用ENVI计算比较繁琐&#xff0c;如今AI的盛行&#xff0c;我们可以轻松解决计算问题&#xff0c;只需1一分钟变可以出图。 详细教学请看上方视频步骤。 更多ChatGPT教学内容请见&#xff1a;ChatGPT结合GIS&#xff1a;一分钟…

深度学习_18_模型的下载与读取

在深度学习的过程中&#xff0c;需要将训练好的模型运用到我们要使用的另一个程序中&#xff0c;这就需要模型的下载与转移操作 代码&#xff1a; import math import torch from torch import nn from d2l import torch as d2l import matplotlib.pyplot as plt# 生成随机的…

服务器为什么会卡顿,出现卡顿情况怎么办

从维护服务器的角度来看&#xff0c;服务器卡顿是一种常见的问题&#xff0c;但服务器卡顿可能会影响到网站、游戏或平台的正常访问和运行&#xff0c;所以出现卡顿问题首先需要对服务器进行全面的检查&#xff0c;确定卡顿原因&#xff0c;然后选取适合的解决方案&#xff0c;…

基于Spring Boot的秒杀系统(附项目源码+论文)

摘要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜爱。本次开发一套基于Spring Boot的秒杀系统&am…

网络编程作业day6

数据库操作的增、删、改完成 #include <myhead.h>//查询的回调函数 int callback(void* data,int count,char** argv, char** columnName) {//count是字段数//argv是字段内容//columnName是字段名称for(int i0;i<count;i) {printf("%s%s\n", columnName[…

智能驾驶规划控制理论学习06-基于优化的规划方法

目录 一、优化概念 1、一般优化问题 2、全局最优和局部最优 二、无约束优化 1、无约束优化概述 2、梯度方法 通用框架 线性搜索 回溯搜索 3、梯度下降 基本思想 实现流程 ​4、牛顿法 基本思想 实现流程 5、高斯牛顿法 6、LM法&#xff08;Le…

通过hyperbeam创建梁单元截面属性

1、为模型中标准的圆柱形创建梁单元和赋予属性&#xff1b; 2、为模型中不标准的对称性实体创建梁单元和赋予属性&#xff1b; 3、为模型中壳体部分创建梁单元和赋予属性&#xff1b;

上位机图像处理和嵌入式模块部署(qmacvisual三个特色)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 了解了qmacvisual的配置之后&#xff0c;正常来说&#xff0c;我们需要了解下不同插件的功能是什么。不过我们不用着急&#xff0c;可以继续学习下…

分布式事务(SeataClient)

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

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

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

折线图 温度变化曲线图

代码详情介绍 导入必要的库&#xff1a; matplotlib.pyplot&#xff1a;用于绘图。 matplotlib.font_manager&#xff1a;用于设置中文字体。 datetime&#xff1a;用于处理日期和时间。 random&#xff1a;用于生成随机数。 numpy&#xff1a;用于生成arange函数的刻度。 设置…

【kubernetes】关于k8s集群如何将pod调度到指定node节点?

目录 一、k8s的watch机制 二、scheduler的调度策略 Predicate&#xff08;预选策略&#xff09; 常见算法&#xff1a; priorities&#xff08;优选策略&#xff09;常见的算法有&#xff1a; 三、k8s的标签管理之增删改查 四、k8s的将pod调度到指定node的方法 方案一&am…

RK356X RK3588 单独编译kernel 与烧录

RK356X RK3588 单独编译kernel 与烧录 可以快速提高我们开发与调试速度 网上可查到的方法如下&#xff1a; RK3568 Android12&#xff1a; 1.添加kernel-4.19/makekernel.sh #!/bin/sh make -j24 ARCHarm64 CC../prebuilts/clang/host/linux-x86/clang-r416183b/bin/clang …

EasyRecovery易恢复2024免激活安装包下载

EasyRecovery易恢复是一款功能强大的数据恢复软件。这款软件由全球著名数据厂商Kroll Ontrack出品&#xff0c;可以恢复被删除的文件、文件夹&#xff0c;以及被格式化的磁盘等数据。无论是硬盘、U盘、SD卡还是其他移动设备&#xff0c;EasyRecovery易恢复都能通过其专业的数据…

全连接神经网络算法原理(激活函数、前向传播、梯度下降法、损失函数、反向传播)

文章目录 前言1、全连接神经网络的整体结构&#xff1a;全连接神经网络模型是由输入层、隐藏层、输出层所组成&#xff0c;全连接神经网络结构如下图所示&#xff1a;全连接神经网络的每一层都是由一个一个的神经元所组成的&#xff0c;因此只要搞清楚神经元的本质就可以搞清楚…

MetaQTL:元分析基础教程

MetaQTL 基础知识 在遥远的海洋中&#xff0c;每个岛屿都藏着无尽的宝藏&#xff0c;而探险家们争相寻找地图&#xff0c;以期揭开宝藏的秘密。 现实世界中&#xff0c;我们的基因组就像那片广阔的海洋&#xff0c;而隐藏在其中的宝藏就是控制我们身高、健康、甚至是我们性格的…
最新文章