C語言 內存分配 (malloc/realloc/calloc區別)

void* realloc(void* ptr, unsigned newsize);

void* malloc(unsigned size);v

oid* calloc(size_t nelem, size_t elsize);都在stdlib.h函數庫內。

C語言的標準內存分配函數:malloc,calloc,realloc等。

       malloc與calloc的區別爲1塊與n塊的區別:malloc調用形式爲(類型*)malloc(size):在內存的動態存儲區中分配一塊長度爲"size"字節的連續區域,返回該區域的首地址。

       calloc調用形式爲(類型*)calloc(n,size):在內存的動態存儲區中分配n塊長度爲"size"字節的連續區域,返回首地址。

       realloc 不能保證重新分配後的內存空間和原來的內存空間指在同一內存地址, 它返回的指針很可能指向一個新的地址。
  所以,在代碼中,必須把realloc返回的值,重新賦給 p 如:
  p = (char *) realloc (p, old_size + new_size);
  
  甚至,你可以傳一個空指針(0)給 realloc ,則此時realloc 作用完全相當於malloc。
  int* p = (char *) realloc (0,old_size + new_size); //全新分配一個內存空間,作用完全等同於以下這行: int* p = (char *) malloc(old_size + new_size);
  
  calloc(len, size)與malloc相似,參數len爲申請地址的單位元素長度,size爲元素個數,如:
  char* p;
  p=(char*)calloc(sizeof(char),1000);

 

 

首先看個問題程序(這裏用的是TC編譯器):

輸出的結果是:
8fc|1
8fe|2
這個程序編譯通過,運行正常,說它有問題,問題出在哪呢?

首先通過malloc,建了一個大小爲2的堆,
i指向的地址是8fc,i+1指向的地址是8fc+sizeof(int)=8fe
但是地址8fe是不受保護的,因爲它不是機器分配給i+1的,隨時會被其他變量佔用。

正確的做法是

    realloc 可以對給定的指針所指的空間進行擴大或者縮小,無論是擴張或是縮小,原有內存的中內容將保持不變。當然,對於縮小,則被縮小的那一部分的內容會丟失。realloc 並不保證調整後的內存空間和原來的內存空間保持同一內存地址。相反,realloc 返回的指針很可能指向一個新的地址。
所以,在代碼中,我們必須將realloc返回的值,重新賦值給 p :
p = (int *) realloc (p, sizeof(int) *15);

甚至,你可以傳一個空指針(0)給 realloc ,則此時realloc 作用完全相當於malloc。
int* p = (int *) realloc (0,sizeof(int) * 10);  //分配一個全新的內存空間,

這一行,作用完全等同於:
int* p = (int *) malloc(sizeof(int) * 10);

『附註:TC編譯器裏sizeof(int)=2,VC裏面sizeof(int)=4;
char型在兩個編譯器裏是一樣的,都是1個字節(8位)』

calloc與malloc相似,參數nelem爲申請地址的單位元素長度,elsize爲元素個數,如:
char* p;
p=(char*)calloc(sizeof(char),20);
這個例子與上一個效果相同


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/bdc995/archive/2008/11/13/3292205.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章