談對C語言中記憶體分配的理解

2021-07-30 17:42:03 字數 2520 閱讀 4451

在我們學習c語言的過程中,掌握記憶體分配是很有必要的。下面是我對記憶體分配的理解,如有不同的見解,請多多指教。

在c語言中,物件可以使用靜態方式和動態的方式分配記憶體空間。

靜態分配:編譯器在處理程式源**時分配。一般程式設計師在源**中直接定義了記憶體分配的大小,程式在執行的過程中,不會更改已經分配的空間。當分配的空間太少了,就會造成溢位;而記憶體分配過多時,則容易造成空間的浪費。

動態分配:程式在執行時呼叫malloc庫函式申請分配。程式設計師可以跟據自己的需要來分配空間,不會造成空間的浪費。

靜態與動態記憶體分配的主要區別如下:

(1)、靜態記憶體分配是在程式執行之前進行的因而效率比較高,而動態記憶體分配則可以靈活的處理未知數目的。

(2)、靜態物件是有名字的變數,可以直接對其進行操作;動態物件是沒有名字的變數,需要通過指標間接地對它進行操作。

(3)、靜態物件的分配與釋放由編譯器自動處理;動態物件的分配與釋放必須由程式設計師顯式的管理,通過呼叫malloc()和free兩個函式來完成。

記憶體中的棧、堆、靜態區:

(1)、棧區(stack)—— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構

中的棧。

(2) 堆區(heap) ——一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os** 。注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶,呵呵。

(3)、靜態區(全域性區)(static)——靜態變數和全域性變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域,程式結束後有系統釋放。

malloc/free函式

malloc()函式用來在堆中申請記憶體空間,free()函式釋放原先申請的記憶體空間。malloc()函式是在記憶體的動態儲存區中分配乙個長度為size位元組的連續空間。其引數是乙個無符號整型數,返回乙個指向所分配的連續儲存域的起始位址的指標。當函式未能成功分配儲存空間時(如記憶體不足)則返回乙個null指標。

由於記憶體區域總是有限的,不能無限制地分配下去,而且程式應盡量節省資源,所以當分配的記憶體區域不用時,則要釋放它,以便其他的變數或程式使用。

malloc函式的用法

呼叫形式: (型別說明符*)malloc(size)

功能:在記憶體的動態儲存區中分配一塊長度為"size"位元組的連續區域。函式的返回值為該區域的首位址。 「型別說明符」表示把該區域用於何種資料型別。 (型別說明符*)表示把返回值強制轉換為該型別指標。 「size」是乙個無符號數。

例如: pc=(char *)malloc(100); 表示分配100個位元組的記憶體空間,並強制轉換為字元陣列型別,函式的返回值為指向該字元陣列的指標,把該指標賦予指標變數pc。

注意:當再次呼叫malloc函式分配空間時,如果已分配的空間後面有足夠的空間時,則直接在其後面開闢所需要的空間。如果已分配的空間後面沒有足夠的空間時,則重新尋找足夠的空間,並把舊空間的內容全部拷貝到新的空間,然後釋放新的空間。

free函式的用法

呼叫形式:free (pc);

功能:釋放pc所指向的一塊記憶體空間,pc是乙個任意型別的指標變數,它指向被釋放區域的首位址。被釋放區應是由malloc函式所分配的區域。在使用free函式後應該把被釋放的空間賦值為空,例pc = null.

使用free()函式時,需要特別注意下面幾點:

(1)呼叫free()釋放記憶體後,不能再去訪問被釋放的記憶體空間。記憶體被釋放後,很有可能該指標仍然指向該記憶體單元,但這塊記憶體已經不再屬於原來的應用程式,此時的指標為懸掛指標(可以賦值為null)。

(2)不能兩次釋放相同的指標。因為釋放記憶體空間後,該空間就交給了記憶體分配子程式,再次釋放記憶體空間會導致錯誤。

(3)不能用free來釋放非malloc()、calloc()和realloc()函式建立的指標空間。

(4)在進行c語言程式開發中,malloc/free是配套使用的,即不需要的記憶體空間都需要釋放**。

(5)不能釋放動態記憶體的一部分。

(6)不能對動態記憶體的越界使用。

malloc和realloc的區別

函式malloc()和函式calloc() 的主要區別是前者不能初始化所分配的記憶體空間,而後者能。

malloc()函式分配的記憶體空間原來沒有被使用過,則其中的每一位可能都是0;反之, 如果這部分記憶體曾經被分配過,則其中可能遺留有各種各樣的資料。也就是說,使用malloc()函式的程式開始時(記憶體空間還沒有被重新分配)能正常進行,但經過一段時間(記憶體空間已經被重新分配)可能會出現問題。

calloc() 函式會將所分配的記憶體空間中的每一位都初始化為零,也就是說,如果你是為字元類 型或整數型別的元素分配記憶體,那麼這些元素將保證會被初始化為0;如果你是為指標型別的元素分配記憶體,那麼這些元素通常會被初始化為空指標;如果你為實型資料分配記憶體,則這些元素會被初始化為浮點型的零。

以上便是我學習動態記憶體之後的一些個人理解,如果我的理解有錯誤,我希望能給我指出來,以便我能更好的理解記憶體空間分配。

C語言中記憶體分配

一 static在c語言裡面可以用來修飾變數,也可以用來修飾函式。1 先看用來修飾變數的時候。變數在c語言裡面可分為存在全域性資料區 棧和堆裡。其實我們平時所說的堆疊是棧而不是堆,不要弄混。例如 在file.c中 int a int main int b int c int malloc sizeo...

C語言中的記憶體分配

1 段 text 裡面儲存的是可執行程式的二進位制指令,為了防止被意外修改,段一般是唯讀的 2 全域性段 資料段data 儲存被初始化過的全域性變數 靜態變數 3 bss段 靜態資料段 儲存靜態變數 被static修飾過的變數 和末初始化的全域性變數,這段內存在程式執行前會被初始化為0 4 堆 he...

C語言中記憶體分配問題

推薦 c語言中記憶體分配 linux size命令和c程式的儲存空間布局 本大神感覺,上面的鏈結的內容,已經很好的說明了 對於乙個可執行檔案,在linux下可以使用 size命令列出目標檔案各部分佔的位元組數 分為 text段 data段與bss段 參考 linux size命令和c程式的儲存空間布...