內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數
在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時,這些儲存但願自動被釋放。效率很高,但是分配的記憶體容量比較有限
在堆上分配也稱為動態記憶體分配:程式在執行的時候用malloc等函式申請任意多少的記憶體,程式設計師自己負責在何時用free釋放記憶體。動態記憶體分配的生存期由我們自己決定,使用非常靈活,但是問題相對也比較多;注意://如果沒有釋放的話,很容易就會造成記憶體溢位,因為堆中的記憶體塊是全域性的,因此不會因為函式的呼叫而結束
1:malloc函式:需要用到的標頭檔案malloc.h
void *malloc(size_t size) //————–>返回的是乙個通用型別的指標,根據需要去進行強轉;
功能:允許從空閒記憶體池中分配連續記憶體但不初始化
引數:size引數實際就是乙個所需位元組數的整數 malloc(20);
返回:若分配成功則返回乙個指向該記憶體塊的指標,在使用時可根據需要做強制型別轉換,否則返回null(空指標)//需要判空
free(p);//釋放記憶體空間,將記憶體釋放出來給系統;
free函式與malloc函式是成對出現的;
申請malloc的時候盡量去給它進行一下初始化,防止後面出現一些不確定性的東西;
malloc的生命週期:只要沒有呼叫free這個函式,程序沒有結束,那麼此時,這個函式的生命週期就會一直存在在記憶體中;它是存放在堆空間中的,它不會因為你去函式呼叫的結束自動去釋放,堆當中的記憶體是全域性的
如:int p = (int )malloc(n*sizeof(int)); //在空閒記憶體池中分配連續記憶體n*sizeof(int)個位元組的堆記憶體空間
#include
#include
void out(int *p,int n)
}int main(void)
else
return
0;}
void *colloc(size_t num_elements,size_t element_size);
功能:功能同malloc是一樣的,但是作初始化
引數:num_elements是所需的元素的數量,element_size是每個元素的位元組數
返回:同malloc函式一樣
也是需要與free(p)進行對稱使用
#include
#include
int main(void)
printf("\n");
free(p);
}else
return
0;}
void *realloc(void *ptr,size_t new_size);
功能:在指標ptr指向的記憶體基礎上擴大或者縮小記憶體
引數:ptr是指向先前通過malloc,calloc和realloc函式後分配的記憶體塊的指標,new_size是記憶體塊的新尺寸,可能大於或者小於原有記憶體尺寸;這個是追加到new_size的新的記憶體
realloc在c語言中也被稱為動態陣列;
realloc函式使用的注意點:
1:當擴充套件記憶體的時候,不會對新增進記憶體塊的位元組進行初始化
2:若不能調整記憶體則返回null,但原有記憶體中的資料是不會發生改變的
3:若第乙個引數為null那麼功能 等同與malloc函式,若第二個引數為0,那麼會釋放呼叫記憶體塊
realloc(null,10*size(int)) 等同malloc(10*sizeof(int));
realloc(p,0); 等同於free
#include
#include
#include
void out(int *p ,int n)
}int main(void)
free之後如果還有這塊記憶體位址的話,此時這塊記憶體歸還給了系統,(可能這塊記憶體還處於乙個空閒狀態)但是還是可以對其進行操作。裡面的值短暫的會保留。
free之後,申請記憶體的那個指標就會變成野指標(宣告了,但是沒有任何指向的指標),有時候會出現野指標錯誤;
所以盡量在操作之後:將指標置為null
p=null;
注意:申請和釋放是成對的,所以程式是不能進行多次free的,否則會崩潰的
動態記憶體分配
在c 中建立乙個物件時,我們必須要為這個物件申請一塊記憶體,而且要用建構函式對這塊記憶體進行初始化。c 中的new和delete相對於c的庫函式malloc和free在這方面有很大的優勢,所以我們主要講的是運算子new和delete。當用new來建立乙個物件時,它會自動在堆裡為物件分配記憶體並且為這...
動態記憶體分配
為什麼使用動態記憶體分配?c語言中的一切操作都是基於記憶體的 變數和陣列都是記憶體的別名,如何分配這些記憶體由編譯器在編譯期間決定 定義陣列的時候必須指定陣列唱的 而陣列長度是在編譯期就必須決定的 需求 程式執行的過程中,可能需要使用一些額外的記憶體空間 malloc和free malloc和fre...
動態記憶體分配
c的儲存類別有4種 自動的 auto 靜態的 statics 暫存器的 register 外部的 extern 全域性變數時分配在記憶體中的靜態儲存區 靜態區域性變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元,是在編譯時賦初值的,只賦初值一次,在程式執行時它已有初值,以後每次呼叫函式時不再重新賦初...