一位学生提出了这个问题,我不确定答案。
猜测包括:“计算”,“清除”,“分块”,“完成”等。
标准库文档没有解释它所代表的含义,也没有类似命名的函数能够指示模式。是否有人知道实际词源并可能有权威参考资料支持?
一位学生提出了这个问题,我不确定答案。
猜测包括:“计算”,“清除”,“分块”,“完成”等。
标准库文档没有解释它所代表的含义,也没有类似命名的函数能够指示模式。是否有人知道实际词源并可能有权威参考资料支持?
calloc
的词源没有官方来源。
一些可信的候选人似乎是:
calloc
需要单独的计数参数。Clear,因为它确保返回的内存块已被清除。
C,指 C 语言。
cfree()
中的 c
表示什么呢? :-S(注:cfree()
是一个释放内存的函数,类似于 C 语言中的 free()
函数。) - alkc
开头的唯一一个函数。也许 c
只是代表 C(编程语言),因为 open
或 alloc
已经被使用过了。请参阅莱斯克 The Portable C Library (on UNIX),这似乎是关于这个 iolib
的文档(虽然与 V6 不完全匹配)。 - cremno我进行了一些研究,并在“UNIX@ TIME-SHARING SYSTEM:UNIX PROGRAMMER'S MANUAL。第七版,第2卷”,章节“程序设计”中找到以下内容(由我斜体标记):
char *malloc(num);
allocates
num
bytes. The pointer returned is sufficiently well aligned to be usable for any purpose.NULL
is returned if no space is available.char *calloc(num, size);
allocates space for
num
items each ofsize
size. The space is guaranteed to be set to 0 and the pointer is sufficiently well aligned to be usable for any purpose.NULL
is returned if no space is available.cfree(ptr) char *ptr;
Space is returned to the pool used by
calloc
. Disorder can be expected if the pointer was not obtained fromcalloc
.
最后一句话清楚地表明calloc()与malloc()
之间的区别肯定是“更多”,而不仅仅是清除内存。
有趣的是,这些数百页中没有任何关于free()
的参考... :-)
从上述两个事实得出结论,我强烈反对calloc()中的“c”代表“clear”的理论。
calloc
的实现做一些与malloc
和清零不同的事情(例如,从预先清零的源中获取内存)。 - Theodoros Chatzigiannakiscalloc()
的V7实现调用了malloc()
,在malloc()
返回后,calloc()
清除了内存。由于它调用了malloc()
,因此可以使用free()
,所以不需要cfree()
。但是在V7中确实有一个cfree()
。如果不需要它,为什么要引入它,因为free()
就可以做到呢? - alk我认为没有人知道。但是,将calloc()调用描述为必须清除内存的语义,与malloc(内存分配)相反,后者返回上一次free()操作留下的任何随机垃圾,这是学生们有用的 modus operandi ,它有助于提醒用户malloc()返回的不安全值。
calloc
= 连续内存分配。
这意味着根据 calloc()
的语法,即
void *calloc (size_t number_of_blocks, size_t size_of_each_block_in_bytes);
它接收两个参数:块数和每个块的大小,因此它为您提供的块数分配了一个内存数组。
malloc
和realloc
也会分配一段连续的内存区域。用与其他相似物品共享的属性来命名某个东西是非常奇怪的。 - David Richerbymalloc
和realloc
只能分配一个给定大小的块。你可以将malloc(x)
理解为“分配x个字节”,将calloc(n,x)
理解为“连续地分配n个大小为x的块”。 - Kwantuum正如Anant的回答所说,它代表连续分配。 Malloc不是从已编译的固定大小数组中进行分配,而是根据需要从操作系统请求空间。 由于程序中的其他活动也可能在不调用此分配器的情况下请求空间,因此malloc管理的空间可能不是连续的。 因此,其空闲存储作为空闲块列表进行保存。 每个块包含一个大小、指向下一个块的指针和空间本身。 块按递增存储地址排序,并且最后一个块(最高地址)指向第一个块。
The C Programming Language,K&R的第2版第8.7节。
man 3 calloc
中摘取:void *calloc(size_t nmemb, size_t size);
-calloc()
函数为一个大小为size
字节的nmemb
元素数组分配内存,并返回指向该分配内存的指针。内存被初始化为0。如果nmemb
或size
为0,则calloc()
返回NULL或者一个唯一的指针值,稍后可以成功地传递给free()
。 - gengisdave