1. 程式人生 > >C/C++ 動態儲存分配 malloc calloc realloc函式的用法與區別

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;
}