笑话大全网 - 爆笑笑话 - C++中一个难以理解的问题

C++中一个难以理解的问题

你和你的同事理解的都不太对

区分一下:

char *p="sdfjsd";

char p[7]="sdfjsd";

char *p="sdfjsd"; 中,

编译器会进行优化,将"sdfjsd"保存在常量区,"sdfjsd"也被作为常量,

而p是指向这个常量字符串的首地址。

所以*p='a',就是对于常量区进行赋值,所以报错。

char p[7]="sdfjsd";中,

编译器在栈区分配7个char型的连续地址空间,

而p是指向这个栈区的首地址。

所以*p='a',就是对于栈区进行赋值,没有问题。

还有一个区别也说一下吧:

char *p="sdfjsd";

char *q="sdfjsd";

这么写,p,q其实是指向同一个地址的,

刚才说了对于常量字符串,编译器会进行优化,只保存一个"sdfjsd"在常量区,

所以p,q指向的同一个地址

char p[7]="sdfjsd";

char q[7]="sdfjsd";

这么写,p,q指向不同的地址的,这个比较简单,就不多说了

===============================

问题补充:实际上我也认为"sdfjsd"是常量字符串,所以对它赋值才会有异常,但是如果是这样,编译器为什么不在编译的时候就进行报错,而非到等到运行时再报异常,比如说,编译器可以要求我们在初始化的时候,用Const类型的指针来引用,const char *p="sdkfjls";

===============================

编译器没有这么智能的,

如果用代码静态解析工具(例如:QAC),是可以查出来的。