ķ& RC(第二版,第5.5節)規定如下(由我強調):這是否應該生成gcc警告?
char amessage[] = "a message"; /* an array */
char *pmessage = amessage; /* a pointer */
amessage是一個數組只是大足以容納的字符序列和 '\ 0'初始化它。陣列中的單個字符可能會更改,但是amessage將始終指代相同的存儲。 OTOH,pmessage是一個指針,初始化爲指向一個字符串常量;該指針可能隨後被修改以指向其他地方;但結果是undefined如果您嘗試修改字符串內容。
現在,我的問題是,是否應的gcc 4.6.1(或C99)在我的Linux系統中產生,而編譯下面的程序與-Wall警告:
int main(void) {
char amessage[] = "a message";
char *pmessage = "a message";
pmessage[0] = 'b';
return 0;
}
(我發現,GCC不會產生如果我正確解釋上述內容,我的期望是它應該)
即使我這樣做,結果也是一樣的:char * pmessage =「a message」; –
我沒有在我面前的K&R,但你確定你引用的代碼是否正確?我認爲它是'char * pmessage =「消息」;在這種情況下,行爲是未定義的,因爲'pmessage'指向一個字符串字面值,而不是你創建的數組。 –
@KedarMhaswade原來,代碼是正確的,因此與您描述的錯誤不匹配。是不是''char * p =「foo」;'instead? – 2013-06-26 00:49:37