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

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

废话不多说,直接上图

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

事情经过:

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

目录
相关文章
|
缓存 小程序 前端开发
赢麻了!smardaten闷声干大事,竟然用无代码开发了复杂小程序!
赢麻了!smardaten闷声干大事,竟然用无代码开发了复杂小程序!
|
8月前
|
搜索推荐 编译器 开发者
应用程序的运行:原理、过程与代码实践
应用程序的运行:原理、过程与代码实践
233 1
|
8月前
|
IDE Linux 开发工具
Python语言的编写和运行代码
Python语言的编写和运行代码
156 1
|
Web App开发 JavaScript IDE
如何直观地理解程序的运行过程?
了解代码的执行过程是编程的基本要求。一个熟练的编程老手只需要用肉眼看着代码,就能对其运行的过程有所了解。然而对于刚接触编程不久的新手来说,这种事情就没那么显而易见了。于是在编写代码和调试代码时,一旦程序的逻辑有些复杂,就像掉进代码的迷宫,完全不知道东南西北。
|
算法 Java Maven
关于OptaPlanner的使用(三)——运行代码案例
关于OptaPlanner的使用(三)——运行代码案例
375 0
|
存储 自然语言处理 编译器
程序的编译与链接(C语言为例) #代码写好后到运行期间要经过怎样的过程呢?# 粗略版 #
程序的编译与链接(C语言为例) #代码写好后到运行期间要经过怎样的过程呢?# 粗略版 #
|
数据采集 JSON 小程序
学小程序还不懂代码结构?——每天三分钟玩转小程序2
学小程序还不懂代码结构?——每天三分钟玩转小程序2
学小程序还不懂代码结构?——每天三分钟玩转小程序2
|
开发框架 缓存 监控
测试是否有必要看开发代码?如何能看懂?
测试是否有必要看开发代码?如何能看懂?
|
程序员 Python
8行python代码展示程序员从入门到大神(或跑路)的全部状态
一行python代码可以做什么? 人生苦短,我用python。python的世界里无处不在的简洁和短小,往往一行代码可以实现很多有意思功能
160 0
|
移动开发 监控 小程序