首先:我們之前所掌握的記憶體開闢方式特點:
1.空間開闢大小是固定的。
2.陣列在申明時,必須指定陣列的長度,它所需要的內存在編譯時分配。
但是由於我們有時候需要的空間大小是在程式執行時才能知道,那我們就可以試試用動態記憶體。
一、malloc和free
這兩個宣告的標頭檔案都是stdlib.h
原型:void *malloc (size_t size)
這裡的size>0 ,以位元組申請。
此時我們就申請的一塊連續可用的空間,並返回指向這塊空間的指標。
1->若開闢成功,則返回開闢好的空間指標。
2->
若開闢失敗,則返回null。
因此malloc的返回值一定要做檢查。
3->
返回值型別為void*,所以malloc函式由使用者自己決定。
原型:void free (void *ptr)
功能:用來釋放動態開闢的記憶體。
在這裡我們說一下記憶體洩漏:
若我們不去free我們自己申請的記憶體,那麼就會發生記憶體洩漏的問題,但是記憶體洩漏會隨著程序的退出而結束。可是有一種叫做常駐程序(在作業系統中不停止的程序)會發生,因此我們一定牢記在用完申請的記憶體之後一定要記著free.
對於free我在說幾點:
1->它並不會釋放此空間,而是斷開指標與目標快取區的聯絡。
2->我們建議以大塊的記憶體空間進行申請。
3->實際申請的記憶體空間會比我們期望的大。
4->free完此指標被我們稱為「懸垂指標」,要將該指標設定為null.
二、calloc
原型:void *calloc(size_t num,size_t size)
功能:為num個大小為size的元素開闢一塊空間,並把每個空間的每個位元組初始化為0.
三、realloc
原型:
void* realloc (void* ptr,size_t size)
功能:靈活的調整型別
1.ptr是要調整的記憶體位址
2.size調整之後新大小
3.返回值為調整之後記憶體起始位置。
4.調整原記憶體空間大的大小的基礎,還會將原來記憶體中的資料移動到新的空間。
realloc在這裡有兩種情況:
1->原有的空間之後有足夠大的空間 方法:直接在之後追加,原空間的資料不發生變化
2->原有的空間之後沒有足夠大的空間 方法:在堆空間另找乙個適合的大小的連續空間來使用,這是函式返回值是乙個新的記憶體位址。
我們來看這樣乙個**
int *ptr = malloc(100);
if (ptr != null)
else
//**1
ptr = realloc(ptr, 1000);
p=null;free(ptr);
弊端:假如我們記憶體申請失敗,那麼將會返回null,也會將之間申請的空間也將找不到,會發生記憶體洩漏。那麼我們進行改進:
//**2
int *p = null;
p = realloc(ptr, 1000);
if (p != null)
p=null;free(ptr);
常見的記憶體錯誤做乙個文字總結
:
解引用操作:
1.需要判空 2.不可越界訪問
對非動態開闢記憶體使用free釋放:
1.只能釋放堆上的空間。
使用free釋放一塊動態記憶體的一部分:
1.free必須整體free
同一塊動態記憶體多次釋放。
1.不可重複,第一次釋放已經為野指標,第二次無法進行訪問。
四、柔性陣列
概念:結構體中的最後乙個元素允許是位置大小的陣列(在結構體內部可以有乙個變長的陣列)
typedef struct st_type
type_a;
特點:
1. 至少有兩個成員。
2. sizeof返回的這種結構大小不包括柔性陣列記憶體。
3.包含柔性陣列成員的結構用malloc()函式進行記憶體的動態分配。
使用:
type_a *p = (type*)malloc(sizeod(type_a) + 100 * sizeof(int));
int i;
p->i = 100;
for (i = 0; i < 100; i++)
free(p);
此時這個陣列就獲得了100個整形元素的連續空間。 記憶體動態管理
記憶體動態管理 主要是指對 堆 記憶體或者自由記憶體的管理和使用 在c語言中使用malloc 和free 動態分配和釋放儲存單元。malloc 以空間大小作為引數,不知道資料具體型別,因此分配空間後範圍的位址指標void 無法指向具體的資料,必須進行強制轉換後才可以指向具體型別資料。c 提供了使用簡...
動態記憶體管理
首先應該明白物件的三種內部的儲存方式 自動儲存,靜態儲存,和動態儲存。當執行離開當期程式塊的時候,堆疊指標返回到它進入程式塊 之前的地方,有效的銷毀了那個程式塊的自動變數。重新進入這個塊會再次建立所有的自動變數。靜態物件宣告或者在檔案域中。動態物件是存在系統呼叫 的在執行期中建立並且儲存在堆中,這是...
動態 記憶體管理
定義變數時,必須制定其資料型別和名字。而動態建立物件時,只需指定其資料型別,而不必為該物件命名。取而代之的是,new表示式返回指向新建立物件的指標,我們通過該指標來訪問此物件。int i int pi new int 這個new表示式在自由儲存區中分配建立了乙個整型物件,並返回此物件的位址,並用該位...