原型: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(intargc,_TCHAR* argv[])
{
int*p;
p=(int*)calloc(5,sizeof(int));
if(p==NULL)
{
printf("calloc分配失败1");
_getch();
exit(0);
}
for(inti=0;i<5;++i)
printf("c:p[%d]=%d\n",i,p[i]);
p=(int*)realloc(p,10*sizeof(int));
if(p==NULL)
{
printf("realloc分配失败2");
_getch();
exit(0);
}
for(inti=0;i<10;++i)
printf("r:p[%d]=%d\n",i,p[i]);
int*q=(int *)memset(p,3,10*sizeof(int));
if(q==NULL)
{
printf("memset分配失败3");
_getch();
exit(0);
}
p=(int*)memset(p,3,10*sizeof(int));
for(inti=0;i<10;++i)
printf("m:q[%d]=%d\n",i,q[i]);
for(inti=0;i<10;++i)
printf("m:p[%d]=%d\n",i,p[i]);
free(p);
q=NULL;
_getch();
return0;
}
运行结果: