亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

c+中的字符串是在靜態內存中創建的嗎?

c+中的字符串是在靜態內存中創建的嗎?

C++
ibeautiful 2019-12-19 18:14:12
c+中的字符串是在靜態內存中創建的嗎?c+中的字符串是在靜態內存中創建的,并且只有在程序退出時才被銷毀嗎?
查看完整描述

3 回答

?
慕尼黑5688855

TA貢獻1848條經驗 獲得超2個贊

創建它的地方是編譯器編寫器的實現決定,真的。最有可能的是,字符串文本將存儲在內存的只讀段中,因為它們從不更改。


在過去的編譯器時代,您曾經擁有像這些文字一樣的靜態數據,以及全局但可變的數據。這些數據存儲在文本(代碼)段和數據(初始化數據)段中。


即使你有這樣的代碼char *x = "hello";,hello字符串本身存儲在只讀內存中,而變量則存儲在只讀內存中。x在堆棧上(如果是全局的,則在可寫內存中的其他地方)。x只需設置為hello繩子。這允許各種棘手的事情,如字符串折疊,以便“無效選項”(0x1000)和“有效選項”(0x1002)可以使用相同的內存塊,如下所示:


+-> plus:0   1   2   3   4   5   6   7   8   9   A   B   C   D   E

|      +---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+

0x1000 | i | n | v | a | l | i | d |   | o | p | t | i | o | n | \0 |

       +---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+

記住,我并不是指只讀存儲器,而是專用于存儲不可更改的東西的內存(操作系統可能會將其標記為只讀)。


它們也從未被摧毀,直到main()出口。



查看完整回答
反對 回復 2019-12-20
?
倚天杖

TA貢獻1828條經驗 獲得超3個贊

是的,字符串文本在整個程序期間都是有效的,即使在銷毀靜態對象的過程中也是如此。

2.13.4/1在“標準”中說

一個普通的字符串文字具有類型為“數組的n個字符”和靜態存儲時間。

該標準在3.7.1/1中提到“靜態存儲持續時間”:

這些對象的存儲應在程序期間持續。



查看完整回答
反對 回復 2019-12-20
?
喵喔喔

TA貢獻1735條經驗 獲得超5個贊

好吧.。是。它們是必須的;組成每個字符串中的字符序列的信息必須在某個地方。如果要動態分配它們,然后進行初始化,用于初始化的信息將駐留在哪里?因此,簡單地使字符串保持靜態是更有效的,這樣一旦程序完成加載,它們就始終是可用的和有效的。



查看完整回答
反對 回復 2019-12-20
  • 3 回答
  • 0 關注
  • 365 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號