9 動態記憶體分配

2021-07-06 05:17:45 字數 2462 閱讀 8256

記憶體管理:軟體執行時對計算機記憶體資源的分配和使用的技術,其最主要的目的是高效、快速的分配、並在適當的時候釋放和**資源

bss段(block started by symbol):

用來存放程式中未初始化的全域性變數和靜態變數,它不包含任何資料,只是簡單地維護開始和結束的位址,即總大小,以便記憶體區能在執行時分配並有效地清零。bss不占用磁碟空間,只在執行時占用。

資料段(data segment)

用來存放已初始化的全域性變數和靜態變數的一塊記憶體區域,可以分為唯讀資料段和讀寫資料段,字串常量等,但一般都放在唯讀資料段中

用來存放程式臨時建立的區域性變數

棧記憶體的錯誤使用

char *fun()

//'a' 字元常量

//5 整形常量

//"iphone" 字串常量

//常量佔⽤記憶體,唯讀狀態,決不可修改!

char * string = "iphone";

string[0] = 'a'; //運⾏崩潰!

malloc等記憶體分配函式分配的記憶體,手動分配,手動釋放

用於存放程式執行**的一段區域,所有的語句編譯後會生成cpu指令儲存在**區

void * malloc(unsigned size);//從記憶體的堆區分配大小為size個位元組的連續記憶體空間

//如果記憶體分配成功,返回記憶體的首位址;失敗則返回null

//從記憶體中申請一塊空間,可以儲存4個int型別的資料即共16個位元組

//賦值要求=兩邊的型別要一致,所以要進行乙個強制轉換,由預設的void * 轉換為int *

int *p = (int *) malloc(4*sizeof(int)); //16個位元組

//使用乙個函式給malloc申請的空間進行初始化

memset(p, 'a', 16);//中間的引數讀的是ascii碼值,所以寫0還是會出現奇怪的數,因此最好直接寫乙個字元

if (p != null) else

for (int i = 0; i < 4; i++)

void

free(void *)//free函式的作用是釋放記憶體,記憶體釋放是標記刪除

分配n個size大小的空間,並且把該記憶體上的所有位元組清零

void * calloc(unsigned n,unsigned size);
//calloc函式

//格式:calloc(塊數,長度)即分配塊數個長度的記憶體空間

//可以自動初始化為0,不需要memset了

int *p = (int *)calloc(4,sizeof(int));

if (p != null) else

for (int i = 0; i < 4; i++)

按給定的位址以及給定的大小重新分配

void *realloc(void *p,unsigned newsize);
//realloc函式:按給定的位址以及給定的大小給已經存在的空間進行擴充套件

int *p = (int *)calloc(4,sizeof(int));

p = (int *)realloc(p,40*sizeof(int));//為了分配連續的空間,若當前空間不夠,則會找新的足夠大的空間,返回新的位址

if (p != null) else

for (int i = 0; i < 40; i++)

void *memset(void *s , int c , size_t n) ;//從s指向的記憶體開始初始化n個位元組的內容為c
void *memcpy(void *dest,const

void*source , size_t n) ;//從source指向的記憶體開始拷⻉到dest,拷⻉n個位元組

int

memcmp(const

void *buf1, const

void *buf2, unsigned

int count)

//⽐較buf1和buf2指向的記憶體是否相同,⽐較count個位元組

動態記憶體分配

在c 中建立乙個物件時,我們必須要為這個物件申請一塊記憶體,而且要用建構函式對這塊記憶體進行初始化。c 中的new和delete相對於c的庫函式malloc和free在這方面有很大的優勢,所以我們主要講的是運算子new和delete。當用new來建立乙個物件時,它會自動在堆裡為物件分配記憶體並且為這...

動態記憶體分配

為什麼使用動態記憶體分配?c語言中的一切操作都是基於記憶體的 變數和陣列都是記憶體的別名,如何分配這些記憶體由編譯器在編譯期間決定 定義陣列的時候必須指定陣列唱的 而陣列長度是在編譯期就必須決定的 需求 程式執行的過程中,可能需要使用一些額外的記憶體空間 malloc和free malloc和fre...

動態記憶體分配

c的儲存類別有4種 自動的 auto 靜態的 statics 暫存器的 register 外部的 extern 全域性變數時分配在記憶體中的靜態儲存區 靜態區域性變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元,是在編譯時賦初值的,只賦初值一次,在程式執行時它已有初值,以後每次呼叫函式時不再重新賦初...