區分壹下:
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),是可以查出來的。