C語言之堆記憶體管理

2021-09-23 22:15:00 字數 2033 閱讀 7784

棧記憶體的大小是有限的(堆記憶體的大小受物理記憶體限制)。

棧記憶體中的資料釋放是不受程式設計師控制的(函式結束後,屬於它的棧記憶體就會被系統自動釋放,它不適合長期存放資料)。

堆記憶體無法與識別符號建立對應關係(必須使用指標來指向堆記憶體)

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 如果...