C專家程式設計(七)

2021-06-13 04:25:19 字數 1372 閱讀 5595

第七章 對記憶體的思考

1、intel80x86記憶體

段是64k的記憶體區域

2、虛擬記憶體

原理:用硬碟擴充記憶體

思路:程式實際需要使用的虛擬記憶體區段的內容被載入物理記憶體。當物理記憶體中的資料一段時間未被使用,則可能被轉移到硬碟,節省的物理記憶體用於載入需要的其他資料。

虛擬記憶體通過"頁"的形式組織。頁是作業系統在磁碟和記憶體之間移動的單位,一般為幾k位元組。

磁碟的交換區:用於儲存備份到磁碟的程序資訊,一般是物理記憶體的幾倍。

對於磁碟的檔案系統和主存,作業系統使用虛擬結點操作。把檔案區域對映到記憶體區域。

3、cache儲存器

位於cpu和記憶體之間,是一種極快的儲存緩衝區

資料從記憶體讀入時,整行的資料(16或32位元組)被裝入cache。cpu對鄰近資料的引用可以從cache中讀取,而不是記憶體。

所有對記憶體的讀取和寫入操作都要經過cache,cache沒有才去訪問記憶體。讀取同時也裝入cache。

4、資料段和堆

資料段包含堆,用於動態分配記憶體,通過malloc函式獲取記憶體,通過指標訪問。

堆裡面的都是匿名的,只能通過指標間接訪問。

calloc函式返回指標前,記憶體內容清0。

realloc函式改變指標所指向的記憶體塊的大小,可大可小。經常把記憶體拷貝到新的地方,然後返回新位址的指標。

被分配的記憶體總是經過對齊(2的乘方),便於訪問。

5、記憶體洩露

堆經常出現的兩種型別的問題:

1)釋放或改寫仍在使用的記憶體(記憶體損壞)

2)未釋放不再使用的記憶體(記憶體洩露)

避免記憶體洩露:呼叫malloc分配記憶體,注意以後呼叫free來釋放

可以使用alloca函式分配動態記憶體,當離開該函式時,記憶體被自動釋放。不過可移植性差

如可檢測記憶體洩露:

1)使用swap命令觀察還有多少可用的交換空間

2)確定可疑程序 pa-lu

6、匯流排錯誤

匯流排錯誤:未對齊的讀寫操作

段錯誤:解除引用乙個未初始化或非法值的指標引起的,試圖往唯讀的文字段儲存值,用完了堆疊

段錯誤的常見程式設計錯誤:

1)壞指標值錯誤:在賦值之前引用記憶體;對指標釋放後,再訪問。改進:free(p);p=null;

2)改寫錯誤:越過陣列邊界寫入資料;在動態分配記憶體兩端之外寫入資料。

3)指標釋放引起的錯誤:釋放同乙個記憶體兩次;釋放一塊未曾使用malloc分配的記憶體;釋放仍在使用的記憶體;釋放乙個無效的指標。

如:for(p=start;p;p=p->next) 在迴圈體內使用free(p),在下一次迴圈迭代時,對已釋放指標進行解除引用操作,導致錯誤。

struct node *p,*start,*tmp;

for(p=start;p;p=tmp)

C專家程式設計

說到c語言,首稱 c程式語言 這是一本入門和進修均可的書籍,值得讀三遍以上,方才有味。進修書籍如 c專家程式設計 是一本c語言較高層次的書,是成為c語言專家的必經之路。我自以為達到了一定的 程度,才開始學習這本書的。人言,c語言是一門藝術,需要多年歷練才能達到較為完善的境界,此言不虛。c語言進修書籍...

C 專家程式設計

2011.9.4 c 專家程式設計 1 容易混淆的 const 關鍵字const 並不能把乙個變數變為常量,它修飾的符號僅表示該符號的值不能被賦值,也就意味著唯讀不可寫,但它並不能防止通過程式內部 甚至外部,其它函式 的方法來修改它。const 最有用支出是用來限定函式的形參,這樣該函式不會修改實參...

c專家程式設計

pag13 關於替代庫函式 標準規定編譯器只有在違反語法規則和約束條件的情況下才能產生錯誤資訊。所有c語言標準標頭檔案中宣告的識別符號均保留,所以不能宣告乙個叫做malloc 的函式,因為在標準標頭檔案裡已經有乙個函式以此為名。但由於這個規定不是約束條件,因此可以違反他。所以可以用自己宣告的函式來替...