十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
calloc函数的功能与malloc函数的功能相似,都是从堆分配内存。
成都创新互联主要从事网站制作、成都做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务南城,十余年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18982081108
函数名: calloc
函数原型:void *calloc(int n,int size);
功 能: 函数返回值为void型指针。如果执行成功,函数从堆上获得size X n的字节空间,并返回该空间的首地址。如果执行失败,函数返回NULL。该函数与malloc函数的一个显著不同时是,calloc函数得到的内存空间是经过初始化的,其内容全为0。calloc函数适合为数组申请空间,可以将size设置为数组元素的空间长度,将n设置为数组的容量。
示例代码:
#include stdio.h
#include stdlib.h
#define SIZE 5
int main()
{
int * p=NULL;
int i=0;
//为p从堆上分配SIZE个int型空间
p=(int *)calloc(SIZE,sizeof(int));
if(NULL==p){
printf("Error in calloc.\n");
return -1;
}
//为p指向的SIZE个int型空间赋值
for(i=0;iSIZE;i++)
p[i]=i;
//输出各个空间的值
for(i=0;iSIZE;i++)
printf("p[%d]=%d\n",i,p[i]);
free(p);
p=NULL;
return 0;
}
malloc()和calloc()的区别:
malloc()和calloc()的功能都是在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针。
而他们之间的区别就是calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据。比如说在内存中分配长度为10的int类型的数组,若使用的是函数calloc(),则数组被初始化为10个0,若是使用malloc()函数,则数组里面存的是垃圾数据。
扩展资料:
malloc()在内存中分配内存的工作机制:
malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。
调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。
然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。
接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。
到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。
于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。
如果无法获得符合要求的内存块,malloc函数会返回NULL指针,因此在调用malloc动态申请内存块时,一定要进行返回值的判断。
参考资料:
百度百科-malloc()
百度百科-calloc()
这是申请内存的函数,存在与头文件stdlib.h中,malloc的使用方法最简单接下来是例子:
#includestdlib.h
#includestdio.h
main()
{
int
*m;
m=(int
*)malloc(sizeof(int)*16);//这里每次在使用malloc的时候前面要加一个强制类型转换,转换到你需要的类型,后面的括号内就是申请的大小,我这例子是申请的16个整数型大小内存代表这个m可以当数组用了
m[11]=8899;
printf("%d",m[11]);
free(m);//记得每次申请后都需要释放内存,不然会造成浪费影响计算机运行速度
}
calloc是申请后自动将申请的内存全都初始化为0
举个例子:
#includestdio.h
#includestdlib.h
main()
{
int
*m;
m=(int
*)calloc(16,sizeof(int));//是不是感觉差不多就是把*改成了,而已
printf("%d",m[10]);//这个肯定是0
free(m);
}
将他们的原型放在这里void
*malloc(int
size);
void
*calloc(int
number,int
size);
size代表大小,number代表个数
void *calloc(size_t nobj, size_t size);calloc函数为由nobj个长度为size的对象组成的数组分配内存,并返回指向分配区域的指针;若无法满足要求,则返回NULL。该空间的初始长度为0字节
void *malloc(size_t size);malloc函数为长度size的对象分配内存,并返回指向分配区域的指针;若无法满足要求,则返回NULL。该函数不对分配的内存区域进行初始化。
void *realloc(void *p, size_t size);realloc函数将p指向的对象的长度修改为size个字节。如果新分配的内存比原来内存大,则内存的内容保持不变,增加的空间不进行初始化。如果新分配的内存比原来的内存小,则分配内存单元不初始化,realloc函数返回指向新分配空间的指针;若无法满足要求,则返回NULL。在这种情况下,原来指针p指向的单元内容保持不变。
str = (char*)calloc(10,sizeof(char));是什么意思?
是分配10个大小为char,也就是十个字节的内存给str,地址类型是char指针
动态内存分配即分配内存大小在运行时才确定,一般在堆中分配。
C语言动态内存分配相关的函数如下几个:malloc、calloc、realloc、free;
malloc函数的使用比较直接,一个成功的malloc调用返回分配的size大小的内存的指针。失败时返回NULL并将错误代码置为ENOMEM。
calloc函数可以分配nr个size大小的内存空间,一般用于一组struct结构体的分配。
realloc函数将ptr指向的内存空间重新分配大小为size并返回新的内存首地址。
free函数释放前三个函数申请的内存空间,所以,使用前三个分配函数分配的内存一定要free掉。