記憶體管理:軟體執行時對計算機記憶體資源的分配和使用的技術,其最主要的目的是高效、快速的分配、並在適當的時候釋放和**資源
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 全域性變數時分配在記憶體中的靜態儲存區 靜態區域性變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元,是在編譯時賦初值的,只賦初值一次,在程式執行時它已有初值,以後每次呼叫函式時不再重新賦初...