Chinaunix首页 | 论坛 | 博客
  • 博客访问: 401948
  • 博文数量: 168
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-09 13:46
文章分类

全部博文(168)

文章存档

2015年(51)

2014年(30)

2013年(87)

我的朋友

分类: C/C++

2015-04-09 14:48:51

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

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

 1:  #include 
 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最重要的态度。

阅读(989) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~