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

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

废话不多说,直接上图

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

事情经过:

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

目录
相关文章
|
2月前
|
编译器 Linux C++
3C++程序的编写和实现
3C++程序的编写和实现
24 2
|
8月前
|
缓存 小程序 前端开发
赢麻了!smardaten闷声干大事,竟然用无代码开发了复杂小程序!
赢麻了!smardaten闷声干大事,竟然用无代码开发了复杂小程序!
|
15天前
|
搜索推荐 编译器 开发者
应用程序的运行:原理、过程与代码实践
应用程序的运行:原理、过程与代码实践
25 1
|
10月前
|
Web App开发 JavaScript IDE
如何直观地理解程序的运行过程?
了解代码的执行过程是编程的基本要求。一个熟练的编程老手只需要用肉眼看着代码,就能对其运行的过程有所了解。然而对于刚接触编程不久的新手来说,这种事情就没那么显而易见了。于是在编写代码和调试代码时,一旦程序的逻辑有些复杂,就像掉进代码的迷宫,完全不知道东南西北。
|
11月前
|
算法 Java Maven
关于OptaPlanner的使用(三)——运行代码案例
关于OptaPlanner的使用(三)——运行代码案例
267 0
|
11月前
|
存储 自然语言处理 编译器
程序的编译与链接(C语言为例) #代码写好后到运行期间要经过怎样的过程呢?# 粗略版 #
程序的编译与链接(C语言为例) #代码写好后到运行期间要经过怎样的过程呢?# 粗略版 #
|
11月前
|
程序员 C语言 C++
编程最重要的技术—调试(以C语言代码为例)
编程最重要的技术—调试(以C语言代码为例)
|
开发框架 缓存 监控
测试是否有必要看开发代码?如何能看懂?
测试是否有必要看开发代码?如何能看懂?
|
设计模式 Java 测试技术
单元测试运行原理探究
单元测试是软件开发过程中的重要一环,好的单测可以帮助我们更早的发现问题,为系统的稳定运行提供保障。单测还是很好的说明文档,我们往往看单测用例就能够了解到作者对类的设计意图。代码重构时也离不开单测,丰富的单测用例会使我们重构代码时信心满满。
单元测试运行原理探究
|
程序员 C语言
Win知识 - 程序是怎样跑起来的——了解程序运行方式的必要性
Win知识 - 程序是怎样跑起来的——了解程序运行方式的必要性
112 0
Win知识 - 程序是怎样跑起来的——了解程序运行方式的必要性