三者都是动态内存分配的函数,返回值都是void*,指向的是内存空间的地址;
malloc(空间大小)参数代表所需开辟空间的字节数,接收时最好将其强制类型转换为接收的类型:
int* p= (int*)malloc(10*sizeof(int));
开辟10个整数大小的空间
由于剩余空间不确定,所以开辟空间有失败的可能,开辟失败时返回值为NULL,所以每次开辟后必须检查是否成功
使用完空间后需要使用free函数将其释放掉,并初始化p:
free(p);
p=NULL;
calloc的作用是开辟空间并初始化为0,其参数也有所不同:
calloc(元素个数,每个元素的大小)
例:int* p=(int*)calloc(10,sizeof(int))
开辟10个整数空间并初始化为0;
calloc使用也需要检查是否成功、用完后释放空间
realloc的作用是改变已开辟动态内存空间的大小,且保留原来内存中的数据;
realloc(已开辟空间的指针,改成多少字节)
例:int* ptr=realloc(p,100);
由于realloc加大空间时可能会与其他文件使用的空间冲突,所以realloc有时会新开辟一块空间,地址与原地址不同,且可能会开辟失败,失败会返回NULL,若直接用原来的指针p接收,开辟失败会导致原来的数据地址丢失,所以需要先判断是否成功,再用原指针接收
例:
int* ptr=realloc(p,40);
if(ptr!=NULL)
{
p=ptr;
…
}
此函数同样需要手动释放内存空间