3 回答

TA貢獻(xiàn)1744條經(jīng)驗(yàn) 獲得超4個(gè)贊
它稱為“字符串池”。在Microsoft編譯器中是可選的,但在GCC中則不是。如果關(guān)閉MSVC中的字符串池,則不同陣列中的“相同”字符串將被復(fù)制,并且具有不同的內(nèi)存地址,因此將占用額外(不必要)的50字節(jié)左右的靜態(tài)數(shù)據(jù)字節(jié)。
編輯:v 4.0之前的gcc有一個(gè)選項(xiàng),-fwritable-strings該選項(xiàng)禁用了字符串池。此選項(xiàng)的作用是雙重的:它允許覆蓋字符串文字,并禁用字符串池。因此,在您的代碼中,設(shè)置此標(biāo)志將允許有些危險(xiǎn)的代碼
/* Overwrite the first string in a, so that it reads 'xne'. Does not */
/* affect the instances of the string "one" in b or d */
*a[0] = 'x';

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
(我假設(shè)你a,b,c并d聲明為局部變量,這是你的籌碼相關(guān)預(yù)期的原因。)
C中的字符串文字具有靜態(tài)存儲(chǔ)持續(xù)時(shí)間。它們永遠(yuǎn)不會(huì)被“分配”在棧上。它們始終分配在全局/靜態(tài)存儲(chǔ)器中,并且“永遠(yuǎn)存在”,即只要程序運(yùn)行即可。
您a,b,c和d數(shù)組被分配在堆棧中。存儲(chǔ)在這些數(shù)組中的指針指向靜態(tài)內(nèi)存。在這種情況下,相同單詞的指針相同并沒有什么異常。
編譯器是否將相同的文字合并為一個(gè)取決于編譯器。一些編譯器甚至具有控制此行為的選項(xiàng)。字符串文字始終是只讀的(這就是為什么最好const char *在數(shù)組中使用類型的原因),因此,在您開始依賴實(shí)際指針值之前,是否合并它們不會(huì)有太大的區(qū)別。
PS只是出于好奇:即使將這些字符串文字分配在堆棧上,您為什么也希望相同的文字多次被“實(shí)例化”?

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超6個(gè)贊
據(jù)我所知,對同一字符串文字的兩個(gè)(或更多)引用必須解析為相同的內(nèi)存位置。即使有些是“重復(fù)的”,編譯器也可以(有些確實(shí))為每個(gè)字符串文字分配存儲(chǔ)空間。
- 3 回答
- 0 關(guān)注
- 495 瀏覽
添加回答
舉報(bào)