2018-01-26 创建人:Ruo_Xiao
参考文档:C99标准
邮箱:xclsoftware@163.com
一、共同点
- 均来自头文件:stdlib.h
- 分配的内存都是连续的。
- 返回值为
void *
,C/C++规定,void* 类型可以通过类型转换强制转换为任何其它类型的指针。 - 若成功,则返回内存对齐的指针;若失败,则返回NULL。
- 均有free释放。
二、calloc
1、原型:
void *calloc(size_t nmemb, size_t size);
2、功能描述
calloc函数申请一个元素个数为nmemb的内存块,每一个元素大小为size,每个元素自动初始化为0。
3、栗子:
char *pStr = NULL;
/*分配内存空间*/
pStr = (char*)calloc(10,sizeof(char));
结果如下:
查看内存:
大家可以发现,该地址后面10个字节均是0,而第11、12、13和14个字节均是未定义,故calloc连续分配了10个字节的内存并自动清零。
三、malloc
1、全称:memory allocation,中文叫动态内存分配。
2、原型:
void *malloc(size_t size);
3、功能描述
malloc 申请指定size大小的内存块,其值不会初始化。
4、栗子:
int *pi = NULL;
/*分配内存空间*/
pi = (int*)malloc(10*sizeof(int));
结果:
查看内存:
大家可以发现,该地址后面40个字节均是cd,而第41、42、43个字节均是未定义,故malloc连续分配了40个字节的内存但没有初始化。
四、realloc
1、原型
void *realloc(void *ptr, size_t size);
2、功能描述
(1)释放原来的内存空间,若原地址后面有足够的内存,则在同一地址下申请size大小的新内存块。若没有,则在新的内存地址下申请内存。
(2)若size小于原来的内存大小,则原数据末尾部分丢失。若size大于原来的内存大小,则原数据完整拷贝到新的内存块,多出来的内存块不初始化。
栗子:
int *pi1 = NULL;
int *pi2 = NULL;
pi1 = (int *)malloc(3*sizeof(int));
pi1[0] = 1;
pi1[1] = 2;
pi1[2] = 3;
pi2 = (int *)realloc(pi1,4*sizeof(int));
结果:
查看内存:
修改代码如下:
pi2 = (int *)realloc(pi1,2*sizeof(int));
结果:
查看内存:
(3)若ptr为NULL,size非零,则realloc会申请一个新的内存块,大小为size,等同于malloc。
栗子:
int *pi2 = NULL;
pi2 = (int *)realloc(NULL,2*sizeof(int));
结果:
查看内存:
(4)若ptr有值,但size为0时,则释放内存,返回NULL,等同于free。
栗子:
int *pi1 = NULL;
int *pi2 = NULL;
pi1 = (int *)malloc(3*sizeof(int));
pi1[0] = 1;
pi1[1] = 2;
pi1[2] = 3;
pi2 = (int *)realloc(pi1,NULL);
结果:
五、free
1、头文件:stdlib.h
2、原型:
void free(void *ptr);
3、功能描述:
释放malloc(或calloc、realloc)函数给指针变量分配的内存空间。
4、使用后该指针变量一定要重新指向NULL,防止野指针出现,有效 规避误操作。
5、若形参为NULL,无操作。