Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3427988
  • 博文数量: 864
  • 博客积分: 14125
  • 博客等级: 上将
  • 技术积分: 10634
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-27 16:53
个人简介

https://github.com/zytc2009/BigTeam_learning

文章分类

全部博文(864)

文章存档

2023年(1)

2021年(1)

2019年(3)

2018年(1)

2017年(10)

2015年(3)

2014年(8)

2013年(3)

2012年(69)

2011年(103)

2010年(357)

2009年(283)

2008年(22)

分类: C/C++

2009-10-09 13:13:27

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

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

oldcamel60202009-10-24 23:55:27

受教了 呵呵 不过是字符代替,不是反转 开始我以为反转 看了半天 呵呵