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

问题描述 投票:0回答:6

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

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

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

c malloc libc calloc c-standard-library
6个回答
63
投票

根据 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的回答和评论。)可能是大约同时引入的一组函数的命名约定。

9
投票

我做了一些研究,在“UNIX@分时系统”中发现了以下内容: UNIX 程序员手册。第七版,第 2 卷”,“编程”一章我用斜体字):

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()
    。 (链接的)源代码没有显示任何将任何内存归零的方法。

从上述两个事实得出结论,我强烈反对

calloc()
中的前导“c”代表“clear”的理论。


4
投票

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


3
投票

calloc
= 连续内存分配。

这意味着根据

calloc()
的语法,即

void *calloc (size_t number_of_blocks, size_t size_of_each_block_in_bytes);   

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


0
投票

正如Anant的回答所说,它代表连续分配。佩

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

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


0
投票
清晰

如果这意味着要分配

明确

多少内存,那就有意义了。 Malloc 意味着内存分配,它需要要分配的字节数作为参数。如果 calloc 意味着清除内存分配,那就有意义了,因为它要求您输入要分配的元素数量以及这些元素的字节大小。

© www.soinside.com 2019 - 2024. All rights reserved.