修改const char* 指向的内容为什么不出错?
我只是想确认下修改const char* 指向的内容会不会真的有问题
代码如下,编译会报警,但运行却没有问题?
- C/C++ code
#include <stdio.h>#include <string.h>int main(){ char a[]="asdf123456"; const char *p = a; printf("\na[]=%s\n",a); a[0]='A'; printf("\na[]=%s\n",a); p[1]='S'; printf("\na[]=%s\n",a); strcpy(p, "987656412"); printf("\na[]=%s\n",a); return 0;}[解决办法]
运行没问题很正常
大多数情况下,const写和不写,编译后的程序是一样的
const是用来限制程序员的,不是用来限制程序的
至于限制程序员有什么意义——等你写过大程序你就知道了
编译出警告而不出错误?
要么你的编译器被你修改了某些选项,允许修改const变量,要么你的编译器应该被掷出窗外
[解决办法]
指向const对象的指针,不论指向的对象是const还是非const,都不能通过该指针去修改对象的值。
- C/C++ code
char a[]="asdf123456"; const char *p = a;
[解决办法]
编译器会报警证明他在提醒你,你这个代码可能会出错。
关键是第二个问题,为什么能运行?
char a[]="asdf123456";
这是个局部变量,局部变量是从栈里分配空间的,恰好栈空间是可读可写的,所以你的代码可以运行。
如果改成这样,那即使你用那个编译器,应该也是运行不起来的:
char *a = "asdf123456";