malloc、realloc、calloc
1.分配記憶體空間函式malloc
呼叫形式: (型別說明符) malloc (size) 功能:在記憶體的動態儲存區中分配一塊長度為”size” 位元組的連續區域。函式的返回值為該區域的首地址。 “型別說明符”表示把該區域用於何種資料型別。(型別說明符)表示把返回值強制轉換為該型別指標。“size”是一個無符號數。例如: pc=(char *) malloc (100); 表示分配100個位元組的記憶體空間,並強制轉換為字元陣列型別, 函式的返回值為指向該字元陣列的指標, 把該指標賦予指標變數pc。
2.分配記憶體空間函式 calloc
calloc 也用於分配記憶體空間。呼叫形式: (型別說明符)calloc(n,size) 功能:在記憶體動態儲存區中分配n塊長度為“size”位元組的連續區域。函式的返回值為該區域的首地址。(型別說明符
簡單的說是:
malloc它允許從空間記憶體池中分配記憶體,malloc()的引數是一個指定所需位元組數的整數.
例如:P=(int*)malloc(n*sizeof(int));
colloc與malloc類似,但是主要的區別是儲存在已分配的記憶體空間中的值預設為0,使用malloc時,已分配的記憶體中可以是任意的值.
colloc需要兩個引數,第一個是需要分配記憶體的變數的個數,第二個是每個變數的大小.
例如:P=(int*)colloc(n,colloc(int));
第二種說法
函式原型不同:
void malloc(unsigned size)//動態申請size個位元組的記憶體空間;功能:在記憶體的動態儲存區中分配一塊長度為” size” 位元組的連續區域。函式的返回值為該區域的首地址。。(型別說明符)表示把返回值強制轉換為該型別指標。
(void *)calloc(unsigned n,unsigned size)//用於向系統動態申請n個, 每個佔size個位元組的記憶體空間; 並把分配的記憶體全都初始化為零值。函式的返回值為該區域的首地址
(void *)realloc(void *p,unsigned size)//將指標p所指向的已分配記憶體區的大小改為size
區別:兩者都是動態分配記憶體。主要的不同是malloc不初始化分配的記憶體,已分配的記憶體中可以是任意的值. calloc 初始化已分配的記憶體為0。次要的不同是calloc返回的是一個數組,而malloc返回的是一個物件。
malloc它允許從空間記憶體池中分配記憶體, malloc()的引數是一個指定所需位元組數的整數.
例如:P=(int*)malloc(n*sizeof(int));
colloc與malloc類似, colloc需要兩個引數,第一個是需要分配記憶體的變數的個數, 第二個是每個變數的大小.
例如:P=(int*)colloc(n,sizeof(int));
例,申請一個字元大小的指標
char *p=(char *)malloc(sizeof(char)); //當然單個是沒有什麼意義的申請動態陣列或一個結構,如
char *str=(char *)malloc(sizeof(char)*100); //相當於靜態字元陣列str[100],但大小可以更改的
typedef struct pointer
{ int data;
struct pointer *p;
} pp;
pp *p=(pp *)malloc(sizeof(struct pointer)); //動態申請結構體空間
一:它們都是動態分配記憶體,先看看它們的原型:
void *malloc( size_t size ); //分配的大小
void *calloc( size_t numElements, size_t sizeOfElement ); // 分配元素的個數和每個元素的大小
共同點就是:它們返回的是 void * 型別,也就是說如果我們要為int或者其他型別的資料分配空間必須顯式強制轉換;
不同點是:用malloc分配儲存空間時,必須由我們計算需要的位元組數。如果想要分配5個int型的空間,那就是說需要5*sizeof(int)的記憶體空間:
int * ip_a;
ip_a = (int*)malloc( sizeof (int) * 5 );
而用calloc就不需要這麼計算了,直接:
ip_a = ( int* )calloc( 5, sizeof(int) );這樣,就分配了相應的空間,而他們之間最大的區別就是:用malloc只分配空間不初始化,也就是依然保留著這段記憶體裡的資料,而calloc則進行了初始化,calloc分配的空間全部初始化為0,這樣就避免了可能的一些資料錯誤。
#include <iostream>
using namespace std;
void main()
{
int * ip_a;
int * ip_b;
ip_a = (int*)malloc( sizeof (int) * 5 );
for( int i = 0; i < 5; i++ )
{
cin>>ip_a[i];
}
for( int j = 0; j < 5; j++ )
{
cout<<ip_a[j]<<" ";
}
ip_b = ( int* )calloc( 5, sizeof(int) );
for( int j = 0; j < 5; j++ )
{
cout<<ip_b[j]<<" ";
}
}
三個函式的申明分別是:
void* realloc(void* ptr, unsigned newsize);
void* malloc(unsigned size);
void* calloc(size_t numElements, size_t sizeOfElement);
都在stdlib.h函式庫內
它們的返回值都是請求系統分配的地址,如果請求失敗就返回NULL
malloc用於申請一段新的地址,引數size為需要記憶體空間的長度,如:
char* p;
p=(char*)malloc(20);
calloc與malloc相似,引數sizeOfElement為申請地址的單位元素長度,numElements為元素個數,如:
char* p;
p=(char*)calloc(20,sizeof(char));
這個例子與上一個效果相同
realloc是給一個已經分配了地址的指標重新分配空間,引數ptr為原有的空間地址,newsize是重新申請的地址長度
如:
char* p;
p=(char*)malloc(sizeof(char)*20);
p=(char*)realloc(p,sizeof(char)*40);
注意,這裡的空間長度都是以位元組為單位。
C語言的標準記憶體分配函式:malloc,calloc,realloc,free等。
malloc與calloc的區別為1塊與n塊的區別:
malloc呼叫形式為(型別*)malloc(size):在記憶體的動態儲存區中分配一塊長度為“size”位元組的連續區域,返回該區域的首地址。
calloc呼叫形式為(型別*)calloc(n,size):在記憶體的動態儲存區中分配n塊長度為“size”位元組的連續區域,返回首地址。
realloc呼叫形式為(型別*)realloc(*ptr,size):將ptr記憶體大小增大到size。
free的呼叫形式為free(void*ptr):釋放ptr所指向的一塊記憶體空間。
C++中為new/delete函式。