1. 程式人生 > >malloc、realloc、calloc

malloc、realloc、calloc

1.分配記憶體空間函式malloc

呼叫形式: (型別說明符) malloc (size) 功能:在記憶體的動態儲存區中分配一塊長度為”size” 位元組的連續區域。函式的返回值為該區域的首地址。 “型別說明符”表示把該區域用於何種資料型別。(型別說明符)表示把返回值強制轉換為該型別指標。“size”是一個無符號數。例如: pc=(char *) malloc (100); 表示分配100個位元組的記憶體空間,並強制轉換為字元陣列型別, 函式的返回值為指向該字元陣列的指標, 把該指標賦予指標變數pc。

2.分配記憶體空間函式 calloc

calloc 也用於分配記憶體空間。呼叫形式: (型別說明符)calloc(n,size) 功能:在記憶體動態儲存區中分配n塊長度為“size”位元組的連續區域。函式的返回值為該區域的首地址。(型別說明符

)用於強制型別轉換。calloc函式與malloc 函式的區別僅在於一次可以分配n塊區域。例如: ps=(struet stu*) calloc(2,sizeof (struct stu)); 其中的sizeof(struct stu)是求stu的結構長度。因此該語句的意思是:按stu的長度分配2塊連續區域,強制轉換為stu型別,並把其首地址賦予指標變數ps。

簡單的說是:

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函式。