天天看點

C/C++ 動态存儲配置設定 malloc calloc realloc函數的用法與差別

一、前言      動态存儲配置設定函數頭檔案malloc.h(ANSI标準建議使用stdlib.h,但很多編譯器可能不支援),提供許多函數來實作對記憶體區域的堆上記憶體進行管理,主要有: void *malloc(unsigned int num_bytes); void *realloc(void* mem_address,unsigned int newsize); void *calloc (size_t nmemb, size_t size);

二、用法

1.malloc函數        配置設定參數給定的位元組數的記憶體空間,如果了解成傳回指針的話,則指針類型需要人為定義。 例如:      int * p =null;      p= (int *) malloc(sizeof(int) * 10);      上述語句事實上是從堆中動态配置設定了40個位元組的記憶體空間(按照int 是4個位元組計算,即10個int的大小),p傳回這一段空間的首位址,當然如果函數執行失敗則傳回null。此處得到的記憶體空間可使用函數memset進行初始化:      memset(p , 0 , sizeof(int)*10);

測試代碼:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

int main(int argc , char* argv[])
{
     int * p= NULL;
     p = (int *) malloc( sizeof(int) * 10 );
     memset(p, 0, sizeof(int) * 10 );
     int a;
     int i;
     for(i = 0;i < 10;i++)
     {
          a = *(p+i);
          printf("a = %d\r\n",a);
     }
     free(p);
     return 0;
}
           

2.calloc函數 和malloc用法類似,第二個參數表示要配置設定的位元組單元大小,第一個參數表示要配置設定多少個這樣的位元組單元,例如:p=(int *) calloc(10 , sizeof(int));是配置設定10乘sizeof(int)個位元組即40個位元組的空間,與malloc不同的是,動态配置設定完記憶體後,自動初始化該記憶體空間為零。當然如果執行成功傳回指針首位址,執行不成功傳回NULL。

測試代碼:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

int main(int argc , char* argv[])
{
     int * p= NULL;
     //p = (int *) malloc( sizeof(int) * 10 );
     //memset(p, 0, sizeof(int) * 10 );
     p = (int *)calloc(10, sizeof(int));
     //不需要memset進行初始化
     int a;
     int i;
     for(i = 0;i < 10;i++)
     {
          a = *(p+i);
          printf("a = %d\r\n",a);
     }
     free(p);
     return 0;
}
           

3.realloc函數 例如:p=realloc(p,n); 第一個參數是指向堆内動态配置設定的記憶體,第二個參數表示重新配置設定的大小(當該參數為0時,傳回NULL,并不代表指針被釋放),事實上該函數主要用來擴大動态配置設定區域,即當第二個參數n大于第一個參數p指向的動态記憶體大小,這個時候,将重新申請一個大小為n的空間,而之前的空間歸還給堆。

測試代碼:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

int main(int argc , char* argv[])
{
     int * p= NULL;
     int * q= NULL;
     p = (int *)malloc (sizeof (int) * 5);
     q = p ;//這種做法事實上存在安全隐患
     printf("before realloc.\r\n");
     printf("p=%p  q=%p\t\n",p,q);
     p = (int *)realloc(p, sizeof(int) * 10);
     printf("after realloc.\r\n");
     printf("p=%p  q=%p\r\n",p,q);
     free(p);
     free(q);
     return 0;
}
           

注:代碼注釋中所說的安全隐患參考:http://blog.csdn.net/snlying/article/details/4005238