在XP平台使用VC++6.0编译运行如下代码:
1 char *s="AAA"; 2 printf("%s\n",s);
编译运行一切正常,但如果在加入一些代码,例如:
1 char *s="AAA"; 2 printf("%s\n",s); 3 s[0]='B'; 4 printf("%s\n",s);
编译通过,但运行过程中输出“AAA”之后,系统弹出“带调试的发送错误报告”对话框,问题表现出来啦。
这其实是一个概念性的问题,AAA是字符串常量,为了对它进行操作,定义了一个指针char *s,但是,s是一个普通的指向char型“变量”的指针,用一个指向变量的指针指向常量,自然会留下隐患。例如像代码中那样对s[0]进行赋值,编译器不会发现这个错误,但是,只有变量的值才是可以修改的(常量无法被赋值,也无法被修改),这个动作的意图是通过指针s来修改一个常量的值,于是,运行的时候错误发生了。
解决这个问题的办法就是从“AAA”最本质的归属出发,需明确告诉编译器,指针指向的类型是常量,不可修改,于是:
1 const char *s="AAA"; 2 printf("%s\n",s);
这样,如果再有对“AAA”有写的动作,编译器就会提示错误,减少后期bug的出现,这也是const的一个重要用法。
这是一个入门的问题,也是一个隐蔽性很高的问题,在此列出,以示警醒。
2013-05-01
其它延伸:
const指针的性质:假设有
int *p const = &a;
那么,可以改变p所指向的值,但不能改变p保存的地址。