51

一个学生问了这个问题,我不确定。

猜测包括:“计数”、“清除”、“分块”、“完成”、...

标准库文档没有说明它代表什么,也没有类似命名的函数可以指示模式。有谁知道实际的词源,也许有权威的参考来支持它?

4

5 回答 5

56

根据《 Linux 系统编程》 (罗伯特·洛夫著)一书的摘录,没有关于calloc.


一些似是而非的候选人似乎是:

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

    • 据报道,Brian Kernighan 相信“c”代表清晰(尽管他承认他不确定)。
    • (见注释。)早期calloc.c似乎在源代码注释中明确引用了clear一词(但没有提及字数或任何其他候选者)。在文件中的另一个源代码注释中malloc.c,单词clear再次出现,引用单词calloc.
  3. C,就像在 C 语言中一样。

    • (参见alk 的回答和评论。)可能是同时引入的一组函数的命名约定。
于 2015-08-08T00:40:45.263 回答
9

我做了一些研究,在“UNIX@ TIME-SHARING SYSTEM: UNIX PROGRAMMER'S MANUAL. Seventh Edition, Volume 2”,“PROGRAMMING”一章斜体由我)中发现了以下内容:

char *malloc(num);

分配num字节。返回的指针对齐得很好,可以用于任何目的。NULL如果没有可用空间,则返回。

char *calloc(num, size);

num为每个size大小的项目分配空间。该空间保证设置为 0,并且指针对齐得很好,可以用于任何目的。NULL如果没有可用空间,则返回。

 cfree(ptr) char *ptr;

空间返回到使用的池中calloc如果指针不是从 获得的,则可能会出现混乱calloc

  • 最后一句话是一个明确的证据,通过清除记忆calloc()肯定(意味着?)与那时相比更加不同。malloc()

    有趣的是free(),这几百页中的任何一个都没有提及... :-)

  • 而且UNIX V6已经有了calloc()哪些调用alloc()。(链接的)源没有显示任何将任何内存归零的方法。

综上所述,我强烈反对前面的“c”calloc()代表“清晰”的理论。

于 2015-08-09T16:09:28.383 回答
3

calloc= 连续的内存分配。

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

void *calloc (size_t number_of_blocks, size_t size_of_each_block_in_bytes);   

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

于 2015-08-08T03:52:57.113 回答
3

我想没有人知道。但是用必须清除内存的语义来描述 calloc() 调用,而不是 malloc(内存分配),它返回之前 free() 操作留下的任何随机垃圾,对学生来说是一种有用的作案方式,这很有用,因为它提醒用户 malloc() 返回一个不安全的值。

于 2015-08-08T11:30:17.497 回答
0

正如 Anant 的回答所说,它代表Contiguous Allocation。每

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

第 8.7 节C 编程语言,K&R,第 2 版。

于 2020-08-29T02:50:24.333 回答