我终于体会到了:代码竟然不可以运行,为什么呢?代码竟然可以运行,为什么呢?

废话不多说,直接上图

初看只当是段子,再看已是段中人

事情经过:

我在写动态顺序表的尾插函数时,写出了如下代码,可以跑,但是这段代码有一个bug暂时先不提

//动态顺序表的尾插
void SLPushBack(SL* psl, SLDataType x)
{if (psl->size == psl->capacity){SLDataType* p = (SLDataType*)realloc(psl->a, psl->capacity == 0 ? 4 : 2 * psl->capacity);//int newcapacity = psl->capacity == 0 ? 4 : psl->capacity * 2;//SLDataType* p = (SLDataType*)realloc(psl->a, newcapacity * sizeof(SLDataType));if (p == NULL){perror("realloc fail");exit(-1);}else{psl->a = p;//psl->capacity = newcapacity;}}psl->a[psl->size++] = x;
}

后来,为了增加代码的可读性,又改为了以下代码,结果发现居然不能跑?!

//动态顺序表的尾插
void SLPushBack(SL* psl, SLDataType x)
{if (psl->size == psl->capacity){//SLDataType* p = (SLDataType*)realloc(psl->a, psl->capacity == 0 ? 4 : 2 * psl->capacity);int newcapacity = psl->capacity == 0 ? 4 : psl->capacity * 2;SLDataType* p = (SLDataType*)realloc(psl->a, newcapacity);if (p == NULL){perror("realloc fail");exit(-1);}else{psl->a = p;psl->capacity = newcapacity;}}psl->a[psl->size++] = x;
}

经过调试发现问题是出现在realloc扩容函数,扩容大小不对

SLDataType* p = (SLDataType*)realloc(psl->a, newcapacity)

改为:SLDataType* p = (SLDataType*)realloc(psl->a, newcapacity * sizeof(SLDataType))

OK,改完之后确实能跑了。随后我就想第一个代码为什么能跑?第一个代码的扩容大小也不对呀,为什么能跑呢?

其第三行正确的应该改为:

SLDataType* p = (SLDataType*)realloc(psl->a, psl->capacity == 0 ? 4 : 2 * psl->capacity * sizeof(SLDataType));

经过大量测试,反正第一个代码就是能跑,不知道什么原因。最后归结为是VS编译器的偶然性Bug,因为我又在DEV编译器上试了一下,第一个代码是跑不了的。

总结:写代码需要小心谨慎和大量测试,不然如果程序出现了Bug还能跑,我们是很难发现这个Bug的。如果开发项目时出现这种情况,程序的Bug就是一个潜在的隐患,如果某一天该Bug突然导致程序崩溃,那么我们是很难找到问题原因的。

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

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

相关文章

庖丁解牛:NIO核心概念与机制详解 02 _ 缓冲区的细节实现

文章目录 PreOverview状态变量概述Position 访问方法 Pre 庖丁解牛:NIO核心概念与机制详解 01 接下来我们来看下缓冲区内部细节 Overview 接下来将介绍 NIO 中两个重要的缓冲区组件:状态变量和访问方法 (accessor) 状态变量是"内部统计机制&quo…

【Spring Boot 源码学习】Banner 信息打印流程

Spring Boot 源码学习系列 Banner 信息打印流程 引言往期内容主要内容1. printBanner 方法2. 关闭 Banner 信息打印3. SpringApplicationBannerPrinter 类3.1 LOG 模式打印3.1.1 getBanner 方法3.1.1.1 新建 Banners3.1.1.2 添加 ImageBanner3.1.1.3 添加 ResourceBanner3.1.1.…

【IPC】消息队列

1、IPC对象 除了最原始的进程间通信方式信号、无名管道和有名管道外,还有三种进程间通信方式,这 三种方式称之为IPC对象 IPC对象分类:消息队列、共享内存、信号量(信号灯集) IPC对象也是在内核空间开辟区域,每一种IPC对象创建好…

酷柚易汛ERP - 序列号盘点操作指南

1、应用场景 将系统中开启序列号的商品数量与与实际存放的数量进行对比。 2、主要操作 2.1 录入序列号 打开【盘点】-【序列号盘点】,新增序列号盘点单,点击【SN】按钮,在弹框中输入序列号。 支持扫描枪录入序列号支持复制粘贴序列号录入…

Linux中系统时间同步

在Windwos中,系统时间的设置很简单,界面操作,通俗易懂,而且设置后,重启,关机都没关系。系统时间会自动保存在BIOS时钟里面,启动计算机的时候,系统会自动在BIOS里面取硬件时间&#x…

全链路监控--pinpoint

一、pinpoint架构原理 架构组成 Pinpoint Agent:和自己运行的应用关联起来的探针 Pinpoint Collector:收集各种性能数据 Pinpoint-Web: 将收集到的数据显成为 WEB网页显示 HBase Storage: 存储收集到的数据 工作原理 pinpoint的核心思想是在各个服务节点之间彼此调用时&a…

tab栏切换,路径传参写死的情况,切换一次路径随之改变

tab栏&#xff0c;使用uview提供的tabs 网址&#xff1a;https://uviewui.com/components/tabs.html <u-tabs :list"tabsList" :scrollable"false" change"tabsChange" :current"tabsCurrent"></utabs> <view class&q…

Canal+Kafka实现MySQL与Redis数据同步(二)

CanalKafka实现MySQL与Redis数据同步&#xff08;二&#xff09; 创建MQ消费者进行同步 在application.yml配置文件加上kafka的配置信息&#xff1a; spring:kafka:# Kafka服务地址bootstrap-servers: 127.0.0.1:9092consumer:# 指定一个默认的组名group-id: consumer-group…

Python 如何实现职责链设计模式?什么是职责链设计模式?Python 职责链设计模式示例代码

什么是职责链&#xff08;Chain of Responsibility&#xff09;设计模式&#xff1f; 职责链&#xff08;Chain of Responsibility&#xff09;设计模式是一种行为型设计模式&#xff0c;旨在构建一个对象链&#xff0c;每个对象都有机会处理请求&#xff0c;并且可以将请求传…

IDEA插件推荐:Apipost-Helper

Hello&#xff0c;大家好&#xff0c;我是灰小猿。 今天分享一下我最近在开发过程中发现的一个比较实用的IDEA插件—Apipost-Helper IDEA虽然能够帮助开发人员更加高效地编写、调试和部署软件应用程序。但我们在编写完接口代码后肯定还需要进行接口调试等操作&#xff0c;这个…

国际知名商学院复旦大学EMBA荣登全球第8位,中文项目国内居首

2023年10月16日&#xff0c;英国《金融时报》&#xff08;FT&#xff09;发布全球EMBA项目排名。复旦大学EMBA位列全球8强&#xff0c;蝉联中文项目全球第一。学术研究、生源资历、商学院顾问委员会国际化程度、整体满意度等数个重要指标位列中文项目全球第 1位。    排名不…

apply和call在Javascript中的使用与区别

apply和call在js中的使用与区别&#xff1a; 字符串格式化&#xff1a; ${占位符} name小帅 console.log(我是${name}) //我是小帅apply: 语法&#xff1a;function.apply(thisArg, [argsArray])thisArg&#xff1a;可选参数&#xff0c;指定函数执行时的上下文&#xff08…