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