“calloc”中的第一个“c”代表什么?

59

一位学生提出了这个问题,我不确定答案。

猜测包括:“计算”,“清除”,“分块”,“完成”等。

标准库文档没有解释它所代表的含义,也没有类似命名的函数能够指示模式。是否有人知道实际词源并可能有权威参考资料支持?


man 3 calloc 中摘取:void *calloc(size_t nmemb, size_t size); - calloc() 函数为一个大小为 size 字节的 nmemb 元素数组分配内存,并返回指向该分配内存的指针。内存被初始化为0。如果 nmembsize 为0,则 calloc() 返回NULL或者一个唯一的指针值,稍后可以成功地传递给 free() - gengisdave
5个回答

61
根据来自Linux系统编程(作者Robert Love)的摘录,关于calloc的词源没有官方来源。

一些可信的候选人似乎是:

  1. Countcounted,因为 calloc 需要单独的计数参数。
  2. Clear,因为它确保返回的内存块已被清除。

    • 据报道,Brian Kernighan 认为 "c" 代表 clear(尽管他承认自己不确定)。
    • (见评论。) 早期的 calloc.c 文件似乎在源代码注释中明确提到了单词 clear(但没有提到单词 count 或任何其他候选词)。在文件 malloc.c 的另一个源代码注释中,单词 clear 再次出现,与单词 calloc 相关。
  3. C,指 C 语言。

    • (见 alk's answer 和评论。) 可能是一组在大约同一时间引入的函数的命名约定。

21
V7(在Unix中添加了malloc()calloc()的版本)源代码在注释中使用clear,并且实际上清除分配的内存块。 - cremno
2
@cremno 哇,那是一个非常有用的参考资料库。它可能让我们尽可能接近答案。我已经编辑了答案,包含了你的链接。 - Theodoros Chatzigiannakis
5
那么 cfree() 中的 c 表示什么呢? :-S(注:cfree() 是一个释放内存的函数,类似于 C 语言中的 free() 函数。) - alk
4
@alk: 哦!有趣的是它没有清除内存(至少没有显式地)。更有趣的是它不是以 c 开头的唯一一个函数。也许 c 只是代表 C(编程语言),因为 openalloc 已经被使用过了。请参阅莱斯克 The Portable C Library (on UNIX),这似乎是关于这个 iolib 的文档(虽然与 V6 不完全匹配)。 - cremno
3
如果你认为已经找到足够的线索证明了"C"指的是C语言本身,那我建议你将其作为答案。(对我来说,这听起来是目前最有说服力的词源解释。) - Theodoros Chatzigiannakis
显示剩余10条评论

9

我进行了一些研究,并在“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 of size 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 from calloc.

  • 最后一句话清楚地表明calloc()与malloc()之间的区别肯定是“更多”,而不仅仅是清除内存。

    有趣的是,这些数百页中没有任何关于free()的参考... :-)

  • 此外,UNIX V6已经有了calloc(),它调用了alloc()。 (链接的)源代码没有显示出清零任何内存的方法。

从上述两个事实得出结论,我强烈反对calloc()中的“c”代表“clear”的理论。


也许它最初代表其他意思,但它肯定被重新用途化(就像iolib的其余部分变成了V7的libstdio一样)。我猜很难得到一个明确的答案(然而Lesk先生似乎仍然活着)。不幸的是已经有一个被接受的答案了。顺便问一下,“count”呢? - cremno
1
我不认同你对文档最后一句话作为“明确证据”的结论,除了它允许calloc的实现做一些与malloc和清零不同的事情(例如,从预先清零的源中获取内存)。 - Theodoros Chatzigiannakis
@TheodorosChatzigiannakis,关于“明显的证据”:calloc()的V7实现调用了malloc(),在malloc()返回后,calloc()清除了内存。由于它调用了malloc(),因此可以使用free(),所以不需要cfree()。但是在V7中确实有一个cfree()。如果不需要它,为什么要引入它,因为free()就可以做到呢? - alk
@TheodorosChatzigiannakis:你说得对,我的两个发现的顺序错了,应该从上到下进行总结。我现在会进行更正... - alk
1
我只是想听听你的意见,但是关于C语言,它最初是可移植C库的一部分(请参见我之前链接的PDF文件)。这也支持了你的第一个论点。 - cremno
显示剩余7条评论

4

我认为没有人知道。但是,将calloc()调用描述为必须清除内存的语义,与malloc(内存分配)相反,后者返回上一次free()操作留下的任何随机垃圾,这是学生们有用的 modus operandi ,它有助于提醒用户malloc()返回的不安全值。


3

calloc = 连续内存分配。

这意味着根据 calloc() 的语法,即

void *calloc (size_t number_of_blocks, size_t size_of_each_block_in_bytes);   

它接收两个参数:块数和每个块的大小,因此它为您提供的块数分配了一个内存数组。


15
但是mallocrealloc也会分配一段连续的内存区域。用与其他相似物品共享的属性来命名某个东西是非常奇怪的。 - David Richerby
2
虽然这是一个老话题,但对我来说,contiguous(连续的)是最有意义的,因为它可以连续地分配n个给定大小的块,而mallocrealloc只能分配一个给定大小的块。你可以将malloc(x)理解为“分配x个字节”,将calloc(n,x)理解为“连续地分配n个大小为x的块”。 - Kwantuum
1
我也是这么想的...连续听起来很对。 - David Callanan
@DavidCallanan 不一定。 “与从编译的固定大小数组中分配不同,malloe将根据需要从操作系统请求空间。由于程序中的其他活动也可能在不调用此分配器的情况下请求空间,因此malloe管理的空间可能不是连续的。因此,它的自由存储被保留为自由块列表。每个块都包含一个大小、指向下一个块的指针和空间本身。” -《C程序设计语言》第二版K&R第8.7节。 - Seraphendipity

0

正如Anant的回答所说,它代表连续分配。 Malloc不是从已编译的固定大小数组中进行分配,而是根据需要从操作系统请求空间。 由于程序中的其他活动也可能在不调用此分配器的情况下请求空间,因此malloc管理的空间可能不是连续的。 因此,其空闲存储作为空闲块列表进行保存。 每个块包含一个大小、指向下一个块的指针和空间本身。 块按递增存储地址排序,并且最后一个块(最高地址)指向第一个块。

The C Programming Language,K&R的第2版第8.7节。


1
堆本身不是连续的,但分配的内存块总是至少在逻辑上连续的。 - Kaiyakha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接