unix高階環境程式設計筆記 記憶體分配呼叫與堆疊空間

2021-08-25 21:36:13 字數 1088 閱讀 5631

#include

void *malloc(size_t size); 分配size個位元組的空間

void *calloc(size_t nobj, size_t size); 分配nobj個size位元組的連續空間

void *realloc(void *ptr, size_t newsize); 分配以ptr為起始位址的size個位元組的連續空間(若ptr為null,則功能與malloc相同)

以上三個函式若成功則返回所分配空間的起始位址,否則返回null。

void free(void *ptr); 釋放以ptr為起始位址的分配空間

注意點:

1.上文三個空間分配函式所分配空間位於程序的heap區

2.realloc分配空間,若newsize比ptr所指的空間大,則先嘗試在原已分配的空間後補差值,若沒有空餘的空間則往高位址尋找適合newsize的自由空間,將ptr原有空間的內容複製到新位址,然後釋放原有空間。

3.空間分配過程(allocation routines)會自動呼叫sbrk來擴充套件程序的堆(heap),大多數系統實現的malloc和free不會減少程序已用的記憶體,free釋放的空間仍保留在malloc池中,用於之後的記憶體分配

4.分配空間除了實際分配的大小外,還有一部分用於記錄所分配空間的大小與下一塊分配空間的指標。而這部分內容(可稱為分配空間塊的頭)一般記錄在所分配空間之前,因此要注意在使用指針對分配空間上的內容進行操作時避免越界,否則將有可能修改了當前分配空間塊或下一塊空間塊的頭資訊。這種錯誤比較常見,並且需要一段時間才會誘發問題。

5.另外可能出現的錯誤是釋放乙個已經釋放過的空間塊,或者呼叫free來釋放本不是由上文三個空間分配函式獲得的空間。一般來說malloc分配空間後若該空間不再使用時要在適當的時候呼叫free釋放,否則有更多的malloc呼叫使得程序占用的記憶體增多,造成記憶體洩漏。

alloca函式

這個函式與上文三個空間分配函式不同,它所分配的空間是在程序的棧區,而不是在堆區,其優點在於我們不用去手動釋放掉這些空間,當函式返回時這些空間會被自動釋放。alloca呼叫會增長棧區的大小,因此在無法通過呼叫alloca自動增加棧大小的系統不支援alloca函式。目前有許多系統支援這個功能

另外關於堆疊空間的參考

《unix環境高階程式設計》筆記2

第四章 檔案和目錄 本章將描述檔案系統特徵和檔案性質 1 stat fstat和lstat函式 原型 include int stat const char restrict pathname,struct stat restrict buf int fstat int filedes,struct...

UNIX環境高階程式設計學習筆記

include include include include int main int argc,char argv err sys can t open s argv 1 while dirp readdir dp null printf s n dirp d name closedir dp ...

unix環境高階程式設計

unix 日曆時間 自1970 年1 月1 日00 00 00 以來的國際標準時間 utc 程序時間 cpu 時間 時鐘時間 程序執行時間的總量。使用者cpu 時間 執行使用者指令時間量。系統cpu 時間 執行核心所經歷時間。命令 time 第三章至第七章 原子操作 任何乙個要求多於1 個函式呼叫的...