C語言中動態內存分配

C語言用了蠻久了,最近在寫一個dsp的程序,發現動態內存使用這一塊還是很欠缺,於是又重新看了看C的書,總結一下。
之前常見的數組或結構體內存分配,其長度必須是固定的常數,如:int a[10]等,當需要申請變長數組時,常規的直接定義就不可以了,如float b[n],其中n爲變量(好像C99之後可以這麼做)。
那麼這個時候就可以使用malloc與calloc函數,申請動態內存了,這兩個函數都在stdlib.h這個頭文件裏,功能都是申請一段長度的內存,並返回內存首地址,不同點在於:malloc申請的內存段裏是隨機的數據,而calloc申請的內存全部初始化爲0。下面是實際中的用法

1.malloc與calloc

double *aa;
aa=(double *)malloc(n*sizeof(double));
或者 aa=(double *)calloc(n,sizeof(double)); //申請內存,其中n可以是變量
if ( aa == NULL ){
printf(“內存分配失敗”);
exit(0);
} //檢測是否成功分配內存


free(aa); //釋放內存
aa=NULL; //指針指向空,防止野指針

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

2.realloc

int *p1;
int *p2;
p1=(int *)malloc(n*sizeof(int));
if( p1== NULL ){
exit(1);
printf(“內存分配失敗”);
}

p2=(int *)realloc( p1, 2*n*sizeof(int));
if ( p2 == NULL) {
exit(1); //此時p1並未釋放
printf(“內存分配失敗”);
}


free(p2);
p2=NULL;
如果之前的內存段(p1)空間足夠,則返回的繼續是p1的地址;如果不夠,則返回新地址。
realloc後p1會自動free掉,但是指針仍然不會指向NULL。
總之realloc用起來會比較容易出現內存泄露,所以建議大家充分掌握後再使用

下面是網友總結的一些注意事項,可以參考一下
realloc使用注意事項(這是總結網友們的經驗)

  1. realloc失敗的時候,返回NULL

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

  3. 假如原來的內存後面還有足夠多剩餘內存的話,realloc的內存=原來的內存+剩餘內存,realloc還是返回原來內存的地址; 假如原來的內存後面沒有足夠多剩餘內存的話,realloc將申請新的內存,然後把原來的內存數據拷貝到新內存裏,原來的內存將被free掉,realloc返回新內存的地址

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

  5. 傳遞給realloc的指針必須是先前通過malloc(), calloc(), 或realloc()分配的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章