C 字元串常量的空間是不需要回收的?
01-04
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編程語言 |