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

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

废话不多说,直接上图

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

事情经过:

我在写动态顺序表的尾插函数时,写出了如下代码,可以跑,但是这段代码有一个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突然导致程序崩溃,那么我们是很难找到问题原因的。

目录
相关文章
|
存储 Shell Linux
【Shell 命令集合 文件管理】Linux 读取命令 read命令使用指南
【Shell 命令集合 文件管理】Linux 读取命令 read命令使用指南
324 0
|
9月前
|
机器学习/深度学习 编解码 计算机视觉
YOLOv11改进策略【Head】| ASFF 自适应空间特征融合模块,改进检测头Detect_ASFF
YOLOv11改进策略【Head】| ASFF 自适应空间特征融合模块,改进检测头Detect_ASFF
1248 13
YOLOv11改进策略【Head】| ASFF 自适应空间特征融合模块,改进检测头Detect_ASFF
|
数据采集
代理IP是按照流量计费还是数量计费好?
在选择代理IP服务提供商时,一项重要的考虑因素就是计费方式。流量计费和数量计费,具体该如何进行选择呢?
|
Java C++ 开发者
【技术贴】if-else VS switch:谁才是Java条件判断的王者?
【6月更文挑战第14天】本文探讨了Java中if-else与switch语句的选择问题。if-else基于布尔逻辑,适合处理复杂逻辑,而switch在处理多分支特别是枚举类型时更高效。if-else在条件动态变化或复杂逻辑时更合适,switch则因其跳转表机制在固定选项中表现优秀。性能上,switch在大量选项时占优,但现代JVM优化后两者差异不大。选择时应考虑场景、可读性和维护性,灵活运用。理解两者特点,才能写出优雅高效的代码。
906 0
|
11月前
|
安全 编译器 C++
constexpr、const和 #define 的比较
本文比较了 `constexpr`、`const` 和 `#define` 在 C++ 中定义常量和函数的优缺点。`constexpr` 用于编译期求值,提供更高的性能和类型安全性;`const` 保证变量在运行期间不可修改,增强代码可靠性;`#define` 用于宏定义,适用于简单的常量和跨平台兼容性。选择时应根据具体需求和代码上下文决定。
|
Python
Python — 四款表白代码送给喜欢的那个她(他)
【8月更文挑战第10天】仅以此篇文章(4个表白代码,每一个都有不一样的惊喜,代码附上了详细注释,方便大家根据注释修改),祝愿轻舟所有的读者得遇良人;七夕快乐~
4172 8
Python — 四款表白代码送给喜欢的那个她(他)
|
监控 安全 网络安全
|
C语言 C++ 开发者
C++基础知识(一:命名空间的各种使用方法)
C++在C的基础上引入了更多的元素,例如类,类的私密性要比C中的结构体更加优秀,引用,重载,命名空间,以及STL库,模板编程和更多的函数,在面向对象的编程上更加高效。C语言的优势则是更加底层,编译速度会更快,在编写内核时大多数都是C语言去写。 在C++中,命名空间(Namespace)是一种组织代码的方式,主要用于解决全局变量、函数或类的命名冲突问题。命名空间提供了一种封装机制,允许开发者将相关的类、函数、变量等放在一个逻辑上封闭的区域中,这样相同的名字在不同的命名空间中可以共存,而不会相互干扰。
267 0
|
安全 Java 编译器
揭秘!那些年我们写过的switch语句,到底隐藏了多少坑?
【6月更文挑战第14天】Java中的switch语句简洁但易误用。忘记在case后加break会导致连续执行多个case,应确保每个case后都有break。switch仅支持byte, short, char, int, 枚举和String类型,其他类型需转换。遗漏default子句可能造成逻辑漏洞,建议始终包含default以处理未预期情况。注意这些细节可提升代码质量。
233 0
|
容器
Element el-container 布局容器组件详解
本文目录 1. 背景 2. 全局样式 3. 布局代码 4. 增加导航菜单 5. 小结
3188 0
Element el-container 布局容器组件详解