昆仑  

遇到这个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最重要的态度。

posted on 2009-08-05 00:36  ttylikl  阅读(3494)  评论(20编辑  收藏  举报