C指標和堆空間 李園7舍 404

2021-06-19 03:28:03 字數 1578 閱讀 9674

相關筆記:c指標和堆空間、c malloc()實際分配空間大小。

根據《the c programming language

》推測得到堆記憶體,圖中的

heap

區域即為堆記憶體塊(

heap

區域的數目不代表計算機堆記憶體的真實數目)。

[1] 

堆記憶體不連續。只有標識為

heap

的才是堆記憶體。

[2]  在malloc()/free()看來,每個heap所代表的的堆由兩部分組成:header +可給使用者使用的堆記憶體。在header中包含了「指向下一鄰近高位址堆記憶體塊的指標」、「本堆塊的大小」。每次由malloc()函式分配給使用者的堆記憶體也必須包含header結構(且所佔記憶體就在返回給使用者使用的堆記憶體之前),這樣是為了讓malloc()/free()更好的管理堆記憶體。

[3]malloc()/free()

函式操作的堆記憶體是如圖所示的乙個鏈(heap1 -> heap2 ->heap3 ->heap4 ->heap1),可通過此鍊錶訪問到任意一段堆記憶體。所以,經malloc()函式實際分配得到的堆記憶體要比使用者實際需求的要大乙個header,只是返回給使用者的堆記憶體大小剛好是使用者所需。free()釋放時,也要根據header的內容將此段曾供給使用者使用過得堆記憶體釋放到最鄰近的乙個堆塊中去。

這就是記憶體中的堆記憶體。堆記憶體由使用者用**分配及**。堆和棧的區別不僅在於記憶體的存在形式,在使用時棧一般擁有記憶體名即棧記憶體可以由記憶體名(變數名)直接訪問,也可以通過位址(指標)訪問棧記憶體。但對於堆記憶體來說,堆不存在記憶體名,只有通過位址(指標)訪問。

#include char *get_memory()

int main(void)

函式執行結果:hello。因為:編譯器不支援的是在函式內返回棧空間的位址。棧空間的生命期完之後就被系統自動**。

未被釋放的堆空間可經子函式返回給父函式中的指標,讓父函式的指標變數來操作堆空間,在父函式中使用完畢後再釋放。

指標名所代表的4 bytes記憶體上存了堆記憶體的首位址後,訪問這塊堆記憶體內容跟平時使用指標差不多。可以以指標的形式訪問(甚用p++ || ++p,堆記憶體首位址可不要丟失,留著釋放),也可以使用下標的形式訪問。

對指標賦施操作時,需要辨清是操作為指標變數本身分配的記憶體(32 bit下為4 bytes)還是操作指標指向的記憶體塊。所謂,指標所指向的記憶體是指此塊記憶體的首位址值是指標的值,也是系統為指標變數分配記憶體內的值。

對前者進行操作如對指標賦值,這種操作要保證所賦的值所代表的記憶體塊可用。在記憶體塊可用的情況下定要保證記憶體塊經初始化後再使用,若記憶體塊不可用則就造就了野指標。

對後者進行操作時,若指標原本就是一野指標(即指標所指的記憶體塊不可用),則應將指標賦值為null以避免使用野指標,消除野指標的潛在危險。若指標所指記憶體塊可用,一定要認清此記憶體塊,不要有越界的操作。

另乙個方面,指標若是指向堆記憶體塊,則一定要讓堆記憶體塊得到準確的釋放。

c note over。

51 數碼管動態顯示 李園7舍 404

首先根據位選與段選理念 數碼管靜態顯示一文 編寫程式去控制不同數碼管顯示不同的數字。根據程式控制需要,在除錯程式的過程中明白需要了解我們所要的控制物件 數碼管 的一些特性。由於我自己擁有的這個微控制器非常的簡單,只有四個數碼管。我的目標是 基於前一篇 數碼管靜態顯示 我以相同的控制訊號理念去編寫程式...

2014深圳銳明視訊校園招聘 李園7舍 404

好幾天前的筆試。今天去九龍坡面試了一趟。遇上輔導員找咱還三方協議,雖然是悄悄的拿的,但就是不想還回去。深圳銳明視訊的宣講會流程為 宣講會 1小時左右 筆試 1 小時半 然後過兩三天的時間部分同學就會收到面試通知。我去面試了一遭,然後將筆試 軟體工程師的筆試題 和面試的經歷記錄如下。在軟體和硬體之間徘...

C 的棧空間和堆空間

一直都把堆疊放一起,所以很多人會誤以為他們的組合是乙個詞語,就像 衣服 一樣簡單,其實不然,今天在下就將最近學習總結的一些與大家分享。乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等,其操作方式類似於資料結構的棧。2...