棧記憶體的大小是有限的(堆記憶體的大小受物理記憶體限制)。
棧記憶體中的資料釋放是不受程式設計師控制的(函式結束後,屬於它的棧記憶體就會被系統自動釋放,它不適合長期存放資料)。
堆記憶體無法與識別符號建立對應關係(必須使用指標來指向堆記憶體)
c語言中沒有管理堆記憶體的語句(標準庫提供了一套函式來管理堆記憶體)
堆記憶體的管理和釋放由程式設計師手動操作(顯式呼叫函式來管理)
c語言為記憶體的分配和管理提供了幾個函式。這些函式可以在標頭檔案中找到。
函式描述
malloc
void* malloc(size_t size);
功能:在堆區分配一塊指定大小的記憶體空間,用來存放資料。
size:要申請的位元組數
返回值:所申請到記憶體的首位元組位址,需要使用指標來接收(如果size的值為0,則返回null)
注意:這塊記憶體空間在函式執行完成後不會被初始化,它們的值是未知的。
free
void free(void* address);
功能:釋放記憶體空間,只是把記憶體的使用權收回,部分內容還在(只象徵性的破壞了內容開頭的一部分)。
address:malloc的返回值,之前所申請的堆記憶體的首位址。
注意:1、記憶體釋放後還能再繼續訪問(不產生段錯誤,可能會造成髒資料),但是在非法使用。2、記憶體釋放後,指標要立即置空,否則指標就會成為野指標。3、一塊記憶體不能連續釋放兩次,會出現堆奔潰。
calloc
void* calloc(size_t num, size_t size);
在記憶體中分配了 num*size 個位元組長度的記憶體空間,並且每個位元組的值都是0。
num:申請的次數
size:每次申請的位元組數
返回值:所申請的記憶體的首位址。如果size或num為0,返回null。
注意:calloc的速度會比malloc慢,因此絕大數情況下不使用。
realloc
void* realloc(void* address, size_t size);
功能:調整已經申請到的記憶體的大小。(相當於拷貝了一塊新記憶體,舊記憶體會被釋放掉)。
address:記憶體的首位址。如果address為空,而size大於0,則相當於申請新記憶體。
size:把記憶體大小調整為size。如果address不為空,而size為0,則相當於釋放記憶體。
返回值:調整後的記憶體的首位址,一定要重新接受,舊位址已經被釋放。
#include
#include
intmain()
要想進行記憶體的初始化,可以使用以下函式:
函式描述
bzero
void bzero(void* s, size_t n);memset
void *memset(void *s, int c, size_t n);
標頭檔案:
功能:把一塊記憶體的每乙個位元組都設定為c
s:要清理的記憶體的首位址
c:位元組中要設定的資料(-128~127)
n:要設定的位元組數
返回值:初始化後的記憶體首位址(方便鏈式呼叫)。
注意:void* 是一種無型別的指標
不能直接使用,不能通過這種指標變數解引用(必須先轉為其他型別)
可以和任意型別的指標進行自動轉換。
void* 也叫萬能指標,解決函式之間專遞指標引數時型別不確定問題。
gnu 認為 void* 和 char* 一樣
當程式結束時,屬於它的資源都會被作業系統**。
記憶體洩露:由於失誤而忘記或無法釋放堆記憶體,導致堆記憶體無法迴圈利用,從而每次都重新申請新的記憶體,可用的記憶體會越來越少。
**記憶體碎片:**已經被釋放但不能被再次分配使用的記憶體。頻繁的申請、釋放記憶體,導致申請和釋放的不協調,一部分記憶體無法被再次使用。記憶體碎片無法杜絕,只能儘量減少。
OC語言之記憶體管理簡介
記憶體管理簡介 1.記憶體管理的重要性 建立乙個oc物件 定義乙個變數 呼叫乙個函式或者方法 2.什麼是記憶體管理 如何 那些不需要再使用的物件?那就得學會oc的記憶體管理 所謂記憶體管理,就是對記憶體進行管理,涉及的操作有 分配記憶體 比如建立乙個物件,會增加記憶體占用 清除記憶體 比如銷毀乙個物...
C語言之記憶體使用
問題 記憶體使用 有人寫了乙個將整數轉換為字串的函式 char itoa int n 如果我呼叫這個函式 char str5 itoa 5 str5會是什麼結果呢?答案分析 答案是不確定,可以確定的是肯定不是我們想要的 5 retbuf定義在函式體中,是乙個區域性變數,它的記憶體空間位於棧 stac...
堆記憶體管理
堆記憶體是 段當中的其中一段,特點就是大,但不能與識別符號建立聯絡,只能與指標配合使用 c語言沒有提供管理堆記憶體的語句,而是標準庫提供了一套管理記憶體的函式 功能 從堆記憶體中分配記憶體 引數 size 所申請的位元組數,一般使用 sizeof 計算 返回值 所申請的記憶體的首位址 注意 1 如果...