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),是可以查出來的。

相关文章