zoukankan      html  css  js  c++  java
  • 一个不应该发生的BUG。。。

    遇到这个BUG已经过了好几天了,很小的一个问题。本不准备再去提及的,后来想想,还是应该写出来以警示自己。

    问题发生于QQ群里的网友在编写一个字符串反转的函数,在测试的时候莫名其妙的遇到了段错误的问题,程序无法正常执行,但是光看函数代码貌似没什么问题,围绕着那个函数翻来覆去的看了N遍也没搞明白。最后却在函数外发现了问题。且以下面的代码做一个示例,演示一下这个BUG吧:

     1:  #include <iostream>
     2:  
     3:  void string_replace(char *p,char src,char ch)
     4:  {
     5:      char *head=p;
     6:      while(*head!=0)
     7:      {
     8:          if(*head==src)
     9:              *head=ch;
    10:          ++head;
    11:      }
    12:  }
    13:   
    14:  int main()
    15:  {
    16:      char *str="This is a test!";
    17:      string_replace(str,' ','_');
    18:      return 0;
    19:  }

    如果你粗心大意的话,也可能会像我当时一样绕了半天没搞明白。错误原因其实很简单————————————不能修改常量!

    虽然这个函数是对一个char *的指针所指的内存进行操作,从函数本身逻辑上来说,可能是不存在任何问题的。然而在函数之外却发生了问题,char *str虽然是一个普通的char *指针,但是它却指向了一个常量字符串"This is a test!",当string_replace试图修改str的时候,实际上是试图去修改常量区的信息,这是被禁止的,无论是windows还是linux,你的程序都会立即被终止掉!

    好了,错误原因明白了,让我们验证试试看吧,将16行代码进行下面的修改:

    1:  //char *str="This is a test!";
    2:  char str[100];
    3:  strcpy(str,"This is a test!");

    这次,我们将str放到栈里,然后从常量区将字符串内容复制到str里,再对其调用string_replace。这次,程序再也不会崩溃了,不用说,函数也能如预期一般的完成功能啦!

    小小总结一下:

    很多时候,错误往往来自自己最容易忽视的地方,细心才是避免和检查BUG最重要的态度。

    http://code.google.com/p/klsudoku
    Email: ttylikl@qq.com
    QQ群:106249 ( Sudoku 群) QQ群:94388010( C++ 群)
  • 相关阅读:
    基础篇
    模块,包
    初识面向对象
    linux在线安装jdk
    热点链接(img map area)
    oracle temp 临时表
    ajax基础代码
    Java编译执行带包名java文件
    oracle spool 用法小结
    Hadoop NameNode safemode
  • 原文地址:https://www.cnblogs.com/ttylikl/p/1539182.html
Copyright © 2011-2022 走看看