原型:void *malloc(int byte_size);
作用:動態開闢byte_size個字節的內存空間,不進行初始化,返回指向此內存的指針,此指針所指數據類型沒有確定,需要強轉。
舉例:int *p=(int *)malloc(5*sizeof(int));
例解:動態開闢5*4=20個字節大小的空間,返回空間首地址指針並強轉爲int *型後賦予指針變量p。
注意:malloc只開闢空間,不初始化,即只將此空間由未佔用狀態變爲已佔用狀態,空間內存儲的具體數據未指定改變。函數返回值是空間首地址,上例中賦給了p變量。
calloc:
原型:void *calloc(int n,int type_byte_size);
作用:動態開闢n*type_byte_size個字節,將每個字節均初始化爲ascii碼0,返回指向此內存的指針,此指針所指數據類型沒有確定,需要強轉。
舉例:int *p=(int *)calloc(5,sizeof(int));
例解:動態開闢5*4=20個字節大小的空間,其中每個字節均賦初值0,返回空間首地址指針並強轉爲int *型後賦予指針變量p。
注意:calloc在malloc的基礎上將空間按字節初始化爲ascii碼0,且其參數有兩個,兩參數之積爲空間總字節數。
realloc:
原型:void *realloc(void *p,int byte_size);
作用:若p所指空間連續大小(單位字節)大於byte_size,則從首地址開始連續地擴充開闢p所指空間至byte_size字節,不對空間再次賦值,將空間地址指針返回;若p所指空間連續大小小於byte_size,則新開闢byte_size字節大小的空間,將p指向的空間內的數據複製進新空間,之後釋放p所指空間(此時p爲NULL),返回指向新空間的指針,此指針所指數據類型沒有確定,需要強轉。
舉例:int *p=(int *)calloc(5,sizeof(int));
p =(int*)realloc(p,10*sizeof(int));
例解:首句中p爲5*4=20字節的空間指針並按字節初始化爲ascii碼0,(int *)強轉後才限定了指向空間的每個元素爲int型。後句將p所指空間擴充爲10*4=40字節的空間指針,未對其二次賦值,故此時p[0]~p[4]爲0,p[5]~p[9]未初始化。
memset:
原型:void *memset(void *p,char c,int byte_size);
作用:將p所指的大小爲byte_size字節的空間按字節賦值爲字符變量c(即指定的ascii碼),返回空間首地址指針,此指針所指數據類型沒有確定,需要強轉。memset所在頭文件爲memory.h。
舉例:int *p=(int *)malloc(5*sizeof(int));
p =(int*)memset(p,3,5*sizeof(int));
例解:第二句中將p所指空間(5*4個字節大小)按字節賦值爲ascii碼3,即每個32位均爲00000011000000110000001100000011,轉化爲十進制爲50529027。之後將返回的指針強轉爲(int*)後賦給p。
注意:按字節賦予ascii碼值並非按原數據類型賦值,強轉後確定數據類型,輸出結果會很“奇怪”。
測試代碼:(malloc省略)
// 動態分配內存測試.cpp: 定義控制檯應用程序的入口點。
//
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include" conio.h"
#include "memory.h"
int _tmain(int argc,_TCHAR* argv[])
{
int *p;
p=(int *)calloc(5,sizeof(int));
if(!p)
{
printf("calloc分配失敗1");
_getch();
exit(0);
}
for(int i=0;i<5;++i)
printf("c:p[%d]=%d\n",i,p[i]);
p=(int *)realloc(p,10*sizeof(int));
if(!p)
{
printf("realloc分配失敗2");
_getch();
exit(0);
}
for(int i=0;i<10;++i)
printf("r:p[%d]=%d\n",i,p[i]);
int *q=(int *)memset(p,3,10*sizeof(int));
if(!q)
{
printf("memset分配失敗3");
_getch();
exit(0);
}
p=(int *)memset(p,3,10*sizeof(int));
for(int i=0;i<10;++i)
printf("m:q[%d]=%d\n",i,q[i]);
for(int i=0;i<10;++i)
printf("m:p[%d]=%d\n",i,p[i]);
free(p);
q=NULL;
_getch();
return0;
}
運行結果: