講C語言內存管理的書籍或者博客?

自學C語言,能寫出簡單的數據結構了。但是不明白C中不同變數(作用域,靜態等),常量,函數調用,堆,棧等在內存中的表示。可否指點一二?


「在內存中的表示」么。不失通用性但又有足夠細節的話,請讀CSAPP:Computer Systems: A Programmer"s Perspective

其中,Chapter 3: Machine-Level Representation of Programs的一章:

題主想要學習的不正是這樣的知識嘛。先通過CSAPP學習通用概念,然後可以具體看每個平台的ABI(Application Binary Interface)的要求以及各個編譯器選擇的分配策略。


我來稍稍歪點樓,推薦的不是書或博客,而是斯坦福的一門公開課 -- 《編程範式》。

斯坦福大學公開課:編程範式

該課程主講C和C++高級內存管理特色;命令式和面向對象2種範式的差異。函數範式(LISP)和並行編程(C和C++) Python C#等新語言概論。基礎要求:具備編程能力,能在抽象化層次上解決問題。學術應該有一定的C++基礎。熟悉矩陣、指針、引用、類、演算法、遞歸、鏈表、HASH演算法、迭代等。

這門公開課前13集就是在講題主所說的「不同變數(作用域,靜態等),常量,函數調用,堆,棧等在內存中的表示」,包括C,也包括C++。而且網易上有中文字幕,理解起來不會太吃力。

比如第三節的介紹是這樣的:

本講在基本數據類型的內存布局的基礎上,講授了結構體的內存布局,以及數組的內存布局,以及它們的混合實現。揭示了C語言中的複雜數據結構的機器特性,以及C語言中無邊界檢查的利弊。最後通過引入swap函數引出了在C語言中寫出通用的,「泛型的」代碼的必要。

後面講關於多線程同步,還有Scheme、Python等一些其他編程語言。

我當時只看到了多線程同步的部分,個人感覺從中得益頗大的。


  • Memory Management: Algorithms and Implementation in C/C++

  • Memory as a Programming Concept in C and C++


講C語言內存管理的書籍或者博客?

自學C語言,能寫出簡單的數據結構了。但是不明白C中不同變數(作用域,靜態等),常量,函數調用,堆,棧等在內存中的表示。可否指點一二?

個人經歷,是從以下幾個層面去了解的:

1 編譯原理:這部分應該了解幾個過程以及它們做了什麼,大致理解生成的IR以及代碼生成,不用太深(深入下去估計你沒時間搞後面的了

書籍的話:除了龍書/虎書/鯨書,可以找點簡單的

2 鏈接/裝載/CRT:這部分應該是核心

書籍:《CSAPP》《程序員的自我修養》《Linkers and Loaders》等

資料:glibc文檔與源碼。

(從CRT可以了解C層面的內存管理malloc/free

(注意ELF文檔格式,理解各個section和segment對理解ELF文件的數據代碼等分布很有幫助

3 操作系統:這部分著重了解mm和process部分,尤其注意進程的虛擬地址空間分布,和2中的裝載結合理解。

資料:linux kernel

(2中的ELF executable file各個segment怎麼映射到進程的虛擬地址空間的...

(還有其他體系結構等等就不說了,

(最後感覺這個坑對提高素養還是挺有用的,不過對工程能力沒有太大的作用...


程序員的自我修養


看richard jones的書


建議程序員的自我修養,講的很不錯


看雪有本C++逆向的書籍,封面是黃顏色的,對你應該有幫助。


趙炯的《Linux內核完全注釋》第三章中,某個小節「C函數調用機制」。寫的很清晰,有C及彙編代碼的解釋。


《深入理解C指針》


C專家編程

C與指針


推薦閱讀:

筆記本內存佔用突然變高,本來29%左右,現在開機就58%,沒開任何程序啊,急求,感謝?
asp.net 應用佔用內存過大如何排查?
Python可以視作同時支持像C++一樣的RAII特性,也具有垃圾回收GC的編程語言嗎?
非同步操作時的內存管理?
是否有可能發現一段內存被野指針修改了?

TAG:C編程語言 | 內存管理 | 計算機科學 | 數據結構 | 編譯原理 |