malloc
malloc()函数就是在内存中找一片指定大小的空间,然后将这个空间的首地址范围给一个指针变量,这里的指针变量可以是一个单独的指针,也可以是一个数组的首地址,这要看malloc()函数中参数size的具体内容。
void * __cdecl malloc(_In_ size_t _Size);//函数原型
int *p =(int *)malloc(sizeof(int)*10); //内存分配
//malloc不会初始化地址内的数据,需要用户手动初始化
for(int i =0;i<10;i++)
{//初始化内存
p[i]=i;//内存实际上就可以看成是数组。
}
在使用malloc后分配的内存大小将不会发生变化,这里要特别注意数组越界问题。
realloc
在上面我们提到了数组越界问题,这在编程中已经是典型的错误了。如果已经申请内存了,但我们又想要插入一个数据,最简单的方法就是回到malloc最初代码行,修改分配的内存的大小。但C/C++为我们提供了一种内存扩展功能,这是我们如果想要扩展malloc已分配的内存则使用函数realloc。
使用realloc扩展内存,有两种情况,一种是malloc之后的内存没有被占用,则自动向下扩展;若被占用,则重新分配地址,并拷贝原来的数据。
//情况一:地址扩展成功
//px的物理地址与p的地址相接,向下拓展
//向下的地址够用,拓展成功,可以直接插入
int *p =malloc(sizeof(int)*10);
for(int i =0;i<10;i++)
{
p[i]=i;
}
int *px = realloc(p,44);
p[11] = 11;
//情况二:地址扩展失败
//向下的地址不够大,拓展失败,则重新分配的内存并将拷贝原有的数据,
//释放原来的内存
int *p_p = malloc(100);
int *px= realloc(p,200);
for(int i =10;i<50;i++)
{
px[i]=i;
}
calloc
初始化为零,参数意义是:指针大小 ,单个元素大小
int *p = calloc(25,sizeof(int));
for(int i =0;i<25;i++)
{
p[i]=i;
}
_recalloc
_recalloc 函数类似于realloc函数,唯一不同的是分配内存时将内存清零。
第一个参数是个数,第二个是元素大小
int *p = calloc(25,sizeof(int));
for(int i =0;i<25;i++)
{
p[i]=i;
}
int *pp = recalloc(p,50,sizeof(int));
for(int i =25;i<50;i++)
{
pp[i]=i;
}
malloc和realloc、calloc和_recalloc 成对使用,前者不同于后者的是前者申请或扩展内存时不会初始化内存,但后者会将内存清零。