C/C++ 動態儲存分配 malloc calloc realloc函式的用法與區別
阿新 • • 發佈:2019-01-25
一、前言
動態儲存分配函式標頭檔案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);
測試程式碼:
2.calloc函式 和malloc用法類似,第二個引數表示要分配的位元組單元大小,第一個引數表示要分配多少個這樣的位元組單元,例如:p=(int *) calloc(10 , sizeof(int));是分配10乘sizeof(int)個位元組即40個位元組的空間,與malloc不同的是,動態分配完記憶體後,自動初始化該記憶體空間為零。當然如果執行成功返回指標首地址,執行不成功返回NULL。 測試程式碼:
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; 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;
}