malloc和calloc的差别
做C这么久了,才了解calloc函数也是挺丢⼈的。
从⽹上了⾮常多关于这两者差别的⽂章。有的甚⾄总结了好多⼈的结论。但我感觉都没有说的⾮常明确。
当中关于函数原型的差别根本就不是必需再讨论了,是个⼈都能看出參数不⼀样。须要讨论的是从原型中反应出的问题。
从原型上看,malloc的含义是“给我⼀个⼤⼩为size的连续内存”,⽽calloc貌似是“给我n个⼤⼩为size的内存”。
因为这种原型。有⼈说(不知道是不是官⽅也这么说)calloc返回的对象数组⽽malloc仅仅是⼀块连续的内存。
这让我产⽣了⾮常⼤的迷惑。为什么返回值仅仅有⼀个?难道返回的是数组的⾸地址,数组⾥⾯存的是分配的n块内存的地址?难道calloc的n个⼤⼩为size的连续内存,在这n个之间却可能是不连续的?假设是这样对这块内存怎么释放呢?“n个⼤⼩为size的内存”这句话本⾝就有歧义(是“⼀块内存⼤⼩是n个size”呢?还是“n块内存每块⼤⼩为size”),带着这些疑问我看了看⽤calloc申请的内存是怎样⽤free来释放的,结果
是跟malloc⼀样仅仅free⼀次就够了。这个结果瞬间让我认为calloc就是个谜⼀样的存在。
“malloc在分配内存的时候会保留⼀定的空间⽤来记录分配情况,分配的次数越多,这些记录占⽤的空间就越多。另外,依据malloc实现策略的不同,malloc每次在分配的时候,可能分配的空间⽐实际要求的多些。多次分配会导致很多其它的这样的浪费,当然,这些都跟malloc的实现有关”。
记录内存的使⽤情况是⾮常正常的啊,要不内存怎么⽤free来释放呢?可是这⾥强调malloc的这⼀点却没有说calloc,难道calloc不⽤记录?那么free是怎样释放⽤它申请的空间的?calloc究竟是个什么?太奇妙了,我该看看calloc的源代码。
从以下这个⽹址我到了⼀段calloc的源代码(apple的地址⾄少还稍具权威性),尽管实现⽅式有多种,但这段代码就⾜以可以说明calloc是什么了:
摘抄代码例如以下:
#include "ansidecl.h"
#include <stddef.h>
/* For systems with larger pointers than ints, this must be declared. */免费分享源码的网址
PTR malloc (size_t);
void bzero (PTR, size_t);
PTR
calloc (size_t nelem, size_t elsize)
{
register PTR ptr;
if (nelem == 0 || elsize == 0)
nelem = elsize = 1;
ptr = malloc (nelem * elsize);
if (ptr) bzero (ptr, nelem * elsize);
return ptr;
}
看了这段代码。能表达我⼼情的仅仅有呵呵⼆字了
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论