標籤:

C 字元串常量的空間是不需要回收的?

Char *a="hhffhvxfhg"

這樣聲明的字元串,內存是系統自己管理的么?

另建一個字元指針指向a,在這個函數外也是能訪問到這段字元串,那這段字元串應該是放在heap吧?這樣不需要回收的么?不會內存泄露的說?

free(a),是會出錯的啊?想知道系統是怎麼管理這段字元串的。

//貌似已有的回答沒達到點上……

假設函數

Void f(){

Char *a="fghjxsdgbc";

}

如果我不停地調用這個函數,不會有什麼不好的後果么?內存不會爆掉么?

//分割線之——我已經明白

謝謝大家的回答,我已經搞明白了。

真是才知道有個只讀數據段啊,在我原來的世界觀里只有堆和棧啊,一直以為除了局部變數在棧,其他都在堆裡面啊!

世界觀更新了的說,好開心!

另外,關於c語言的書,我真的之看過譚浩強。當初c語言老師就說這個書爛,所以其實這個書也沒認真看。。。

c經驗全部來自自我實驗。。。

但是實際使用中算是夠用了。

而且以前做的東西從來沒涉及到字元串,這個問題是我瞎想想到的,隨便試下,發現問題,就來問問了。

//---------------------------------關於我的c語言知識是否夠用的問題

至少對於我是夠用的。

因為我不做應用程序,所以很多語言特性都沒有接觸到。

現在讀phD,跟著導師研究NP難問題求解,做一些優化問題的求解演算法。

我們遇到的問題一般都是很抽象的數學模型。

就算沒有數學模型,我們也會去掉一切不相關的東西自己把問題抽象成數學模型。

所以我一般專註於問題邏輯,主要也就是數組的操作,鏈表的操作都比較少。

所以沒有在程序中出現過處理字元串的情況(如果確實需要處理字元串,我會去用python)。

說個讓大家笑話的,有時候為了方便,有的全局變數乾脆直接malloc一個特別大的空間。。。。。。

其實,好多計算機學院搞理論的老師都不會編程。。。比如我祖師爺,搞了一輩子演算法證明。

說起來讓我想到之前網上的一個梗, 叫《大家小心所謂的計算機博士》,裡面有段這樣說的:

……

問他的專業方向時總是含糊不清,老是說就是演算法複雜性,不知道會做什麼。即便我這樣不懂的也知道博士了怎麼可能還在讀那麼基礎的東西?博士不都應該是專家了么!問他會研究什麼問題,他說不知道中文該怎麼說。我英文還可以,就說不行你說英文吧。他就支支吾吾地說那就說幾個短的名詞吧,什麼polynomial vs non-polynomial什麼的,計算機博士怎麼會研究什麼多項式之類的東西,這不是高中數學么,而且發音很差,帶有濃重的歐洲小國口音,一點不像讀英文教材的人。

……

問他有什麼很牛逼的地方嗎?他回答說他證複雜性證的好。然後我問這個是不是特別有用?他羞射地笑了笑,支支吾吾說他不知道天天證複雜性以後有什麼用。

……

當時看著特有共鳴,我tm就是在搞這些東西啊!

當然,我覺得證複雜性還是有用的,至少證出來了你就可以告訴別人:「這個問題很難,不用花時間去找求最優解的演算法了!」


gcc 編譯的話, 類似 "hhffhvxfhg" 這樣的字元串常量位於 elf 文件的 .rodata 段, 可以用 objdump 工具查看. 除非是使用類似 calloc(), malloc() 等在堆區域申請了內存才需要 free(). 你可以查看 free(3) 的手冊.

如果想了解更多, 請閱讀 程序員的自我修養 一書.


問號太多了,只能一一作答

1:不是系統自己管理的

2:不是放在heap的

3:不需要回收

4:不會內存泄漏

5:不是malloc的東西你去free當然要出錯

6:沒有什麼不好的後果,除了浪費時間

7:內存真的不會爆掉


「字元器常量」是存在程序的 .rodate 段,不是放在heap

程序在運行時整個被載入到內存,它的位置(虛擬地址)是固定的。


你覺得你不停的調用那個函數,系統就會不停的分配新的空間來存放那個字元串么?你們公司每次要蓋章的時候都去刻一個公章么?


字元串"fghjxsdgbc"位於只讀數據區(段), 也就是大家說的.rodata 這是一個儲存空間, 不是堆也不是占.並且是在整個程序的生存周期都是存在的.

調用f, 會在棧上為變數a分配空間, 並給a複製為字元串"fghjxsdgbc"的地址.

然後在f調用結束後, 這個棧上的空間會被回收

再次調用f, 又會為a分配空間, 賦值, 回收.

其他的就看 @port gle 說的那本書吧. 區別下全局變數, static, 局部變數, malloc/calloc等等.


……你需要一些關於C語言基礎的書。而不是在這裡問。。


&<程序員的自我修養&>


同學,這種問題你應該去問百度知道。


這屬於常量字元串 不在堆也不在棧中 不存在內存泄露


是的。常量在靜態空間,不能free。free只能free heap上申請的塊。

字串,值為一個常量指針,你每次賦值,僅僅是將這個地址賦予字元指針,並沒有創建新的拷貝。

即:每次調用此函數,在堆棧申請一個指針,然後賦值。函數返回,堆棧被推出,不復存在。

所以,不會內存爆掉


要從根本上理解這個問題,還是學一下彙編吧,看一下標準的x86彙編程序的結構


推薦閱讀:

C++數組名可以看成指針么?
C 語言指針怎麼理解?
同樣的數組參數,用sizeof求數組長度為何會產生不同的結果?
國外有什麼優秀的c語言入門教學視頻?
僅用C語言可以構造出Python中Dict那種數據結構嗎?

TAG:C編程語言 |