2012-04-03 40 views
5

我相信在C99中,字符串文字的修改是未定義的行爲。我沒有這樣的標準的一個副本,但我有C1X(n1570)中6.4.5第7段其中規定草案:根據C89標準修改字符串文字未定義行爲?

這是不確定的這些陣列是否提供了不同的元素具有 適當的價值。如果程序試圖修改這樣一個數組,行爲是 未定義。

我發現一個堆棧溢出question觸及這個話題,包含來自喬納森·萊弗勒的評論:

本來,C89(C90)的標準並沒有取締修改文字,因爲有太多在標準之前編寫的許多代碼將被它破壞。

但我也看到很多的字符串文字的類型和事實的討論中,他們是char[N]而不是const char[N]。我認爲這個決定是爲了讓大量的現有代碼不會中斷。

任何人都可以給我一個明確的答案。在C89中字符串文字修改UB?

+0

什麼?據我所知,字符串文字是'const char *' ... – 2012-04-03 20:53:31

+6

@ H2CO3:不屬於C. – 2012-04-03 20:54:05

+1

我記得看到一個程序爲老的[PDP-11](https://en.wikipedia.org/wiki/PDP-11)將合併目標代碼中的相同字符串爲了使它更小,所以即使在C89之前修改字符串文字也是一個糟糕的主意。 – 2012-04-03 21:03:04

回答

13

是的,它們在C89中是不可修改的。

(C90,6.1.4)「如果程序試圖修改字符串文字兩種形式,其行爲是未定義」

即使以K & [R第2版,有關於報價字符串文字的不變性。

(K & R2,5.5) 「的結果是不確定的,如果你試圖修改字符串內容」

(K & R2,附錄C)「字符串不再修改,因此可能放置在只讀存儲器」

在ANSI C89理由,存在爲什麼它是不可修改的說明:

(ANSI C89 Rationa le,3.1.4)「字符串文字被指定爲不可修改的。本規範允許實現共享具有相同文本的字符串副本,將字符串文字放在只讀內存中,並執行某些優化。「