C語言中動態記憶體分配

2021-07-31 03:57:33 字數 1514 閱讀 4657

c語言用了蠻久了,最近在寫乙個dsp的程式,發現動態記憶體使用這一塊還是很欠缺,於是又重新看了看c的書,總結一下。

之前常見的陣列或結構體內存分配,其長度必須是固定的常數,如:int a[10]等,當需要申請變長陣列時,常規的直接定義就不可以了,如float b[n],其中n為變數(好像c99之後可以這麼做)。

那麼這個時候就可以使用malloc與calloc函式,申請動態記憶體了,這兩個函式都在stdlib.h這個標頭檔案裡,功能都是申請一段長度的記憶體,並返回記憶體首位址,不同點在於:malloc申請的記憶體段裡是隨機的資料,而calloc申請的記憶體全部初始化為0。下面是實際中的用法

double *aa;

aa=(double *)malloc(n*sizeof(double));

或者 aa=(double *)calloc(n,sizeof(double)); //申請記憶體,其中n可以是變數

if ( aa == null ) //檢測是否成功分配記憶體

… …

free(aa); //釋放記憶體

aa=null; //指標指向空,防止野指標

但是在實際使用中我遇到了一些問題:就是在用dsp開發時,我的的確確使用了calloc申請記憶體,然後free(ptr)和ptr=null釋放記憶體,但是發現每次calloc在堆上取的位址仍然會不斷增加,增加的位址大小剛好是每次申請的記憶體大小(我是迴圈呼叫calloc),希望懂行的人幫忙分析下原因。

int *p1;

int *p2;

p1=(int *)malloc(n*sizeof(int));

if( p1== null )

p2=(int *)realloc( p1, 2*n*sizeof(int));

if ( p2 == null)

… …

free(p2);

p2=null;

如果之前的記憶體段(p1)空間足夠,則返回的繼續是p1的位址;如果不夠,則返回新位址。

realloc後p1會自動free掉,但是指標仍然不會指向null。

總之realloc用起來會比較容易出現記憶體洩露,所以建議大家充分掌握後再使用

下面是網友總結的一些注意事項,可以參考一下

realloc使用注意事項(這是總結網友們的經驗)

realloc失敗的時候,返回null

realloc失敗的時候,原來的記憶體不改變,也就是不free或不move,(這個地方很容易出錯)

假如原來的記憶體後面還有足夠多剩餘記憶體的話,realloc的記憶體=原來的記憶體+剩餘記憶體,realloc還是返回原來記憶體的位址; 假如原來的記憶體後面沒有足夠多剩餘記憶體的話,realloc將申請新的記憶體,然後把原來的記憶體資料拷貝到新記憶體裡,原來的記憶體將被free掉,realloc返回新記憶體的位址

如果size為0,效果等同於free()。此時返回的是null,原有指標已經被釋放掉,不能再用,所以要在realloc後加上判斷 if(p2==null)

傳遞給realloc的指標必須是先前通過malloc(), calloc(), 或realloc()分配的。

C語言中的動態記憶體分配

目錄 什麼是記憶體的動態分配?怎樣建立記憶體的動態分配?用malloc函式開闢動態儲存區 用calloc函式開闢動態儲存區 用realloc函式重新分配動態儲存區 用free函式釋放動態儲存區 void指標型別 全域性變數是分配在記憶體中的靜態儲存區的,非靜態的區域性變數 包括形參 是分配在記憶體中...

c語言動態記憶體分配 C 動態記憶體分配

動態記憶體分配 雖然通過陣列就可以對大量的資料和物件進行有效地管理,但是很多情況下,在程式執行之前,我們並不能確切地知道陣列中會有多少個元素。這種情況下,如果陣列宣告過大,就會造成浪費 宣告過小,就會影響處理。在c 中,動態記憶體分配技術可以保證程式在執行過程中按照需要申請適量記憶體,使用後釋放,從...

C語言中的動態記憶體分配詳解

c語言中最難也最重要的要數指標這一章了,對指標的熟練程度決定了你對 c語言的學習的好壞程度,筆者自己在學習 c語言時,在指標上花費的時間幾乎等於學習其他基礎知識的時間,所以,對指標這一章有著自己獨特的見解和學習方法。指標,簡單來說其作用就是用來操作記憶體的,而c 語言中動態記憶體分配就是一大難點,所...