1.**malloc**
原型:extern void *malloc (size_t __size);
2.**calloc**
原型:extern void *calloc (size_t __nmemb, size_t __size)
3.**realloc**
原型:extern void *realloc (void *__ptr, size_t __size)
功能类似:分配size大小的连续的内存空间,并返回void类型的指针,可以通过强制转化为所需类型;
eg.
char *str = (char *)malloc(sizeof(char) * 10);
int *iter = (int *)calloc(sizeof(int),10);
float *f = (float *)realloc(NULL,sizeof(float) * 10);
差别:
1. malloc所申请的内存并没有初始化,可能是任意值,但是calloc所分配的内存会被初始化,当申请的类型为字符型初始化为‘\0’,整形则为0;
2.realloc的第一个参数为NULL时,功能和malloc相似,
当char p = (char )realloc(q,sizeof(q) * 2);时,
如果在物理空间上与q相邻的空间大于等于所申请的内存,则扩大其指向的地址,反之则重新分配一个足够大的内存空间,并将原先的数据拷贝至新的内存空间中,最后返回内存地址的指针;
3.free
malloc/callco/realloc在堆上分配的内存需要手动释放;
char p= (char )realloc(q,sizeof(char) * 10);
realloc使用free时要注意最后的地址是否改变:
如果地址改变,也就是p的内存空间大于q的内存空间时,函数realloc会自动free(q),只需手动free(q)即可;
反之,p和q指向同一块内存要避免对一块内存重复释放;