如题,C风格字符串,"123"不是const char *类型的常量么?为什么赋给一个普通指针是可以的呢?
业精于勤,荒于嬉;行成于思,毁于随。
這樣做雖然不會報錯,但是試圖對p指向的字串123進行修改將造成記憶體違規存取。因為"123"是字串常數,存放在唯讀儲存區。之所以要求使用const char*是為了避免程式設計師錯誤的對123進行修改。
123
const char*
初學者試答"123"是一個const char 類型的對象,const char * p 應該從右往左讀,意思是p 是一個指針,指向的對像是const char 類型,這不正好麼? 同理,你在後面加一句p = "456"; 也是對的,只要求p指向的對像是const char 即可。
char *p = "123";是否表示是一個字元陣列?即字串
char *p = "123";
編譯加入-Wall後會看見警告。
-Wall
warning: ISO C++11 does not allow conversion from string literal to 'char *' [-Wwritable-strings] char *p = "hello"; ^
char *p = "123";實際上是兩個過程,在常數區分配字串空間,宣告字元指標p,p指向這個字串所處記憶體空間,若有不對請立即指正
c語言留下的坑
這是為了相容c而留下來的
這樣做雖然不會報錯,但是試圖對p指向的字串
123
進行修改將造成記憶體違規存取。因為"123"是字串常數,存放在唯讀儲存區。之所以要求使用const char*
是為了避免程式設計師錯誤的對123
進行修改。初學者試答
"123"是一個const char 類型的對象,const char * p 應該從右往左讀,意思是p 是一個指針,指向的對像是const char 類型,這不正好麼? 同理,你在後面加一句p = "456"; 也是對的,只要求p指向的對像是const char 即可。
char *p = "123";
是否表示是一個字元陣列?即字串編譯加入
-Wall
後會看見警告。char *p = "123";實際上是兩個過程,在常數區分配字串空間,宣告字元指標p,p指向這個字串所處記憶體空間,若有不對請立即指正
c語言留下的坑
這是為了相容c而留下來的