这个问题已经在这里有了答案:




已关闭8年。






我已经注意到许多C函数调用,尤其是那些处理内存或文件操作的函数,但并非所有函数都同时使用这两个参数。例如,将malloc传递给一个参数,即所需内存空间的大小(以字节为单位)。另一方面,Calloc传递了两个参数,一个元素的字节大小和元素数(大小和nmem)。还有其他函数也使用这些size和nmem参数。

从本质上讲,calloc调用将分配与调用malloc(nmemsize)相同的内存量,因此,实际上发生的是将星号()替换为逗号(,)。至少这是我可以从更高层次上知道的。我看不到与调用calloc(1,nmemsize),calloc(nmemsize,1)或calloc(nmem,大小)的区别。

实际上在较低级别上发生了什么,使得调用calloc(1,nmem * size)与calloc(nmem,size)根本不同吗?

编辑:我知道calloc和malloc之间的功能差异。我对为什么参数存在差异感兴趣。还有其他函数使用2个size参数作为总大小(fread,fwrite等)。我不在乎特定的函数,而是在本质上总的大小变成两个参数相乘时为什么在函数中使用两个总大小的参数。在使用这些函数的大部分时间里,我都会在“size”参数中使用所需的大小,在“nmem”(有时是“count”等)参数中使用“1”。

最佳答案

在对问题的评论中,我写道calloc()可以在重要的平台上实现更好的内存对齐。我还没有找到任何东西来支持那个(至今)。我很确定这是VMS/VAXC编译器的功能,但是该源很匮乏。

但是,我确实发现calloc()alloc()是在1975年5月发布Unix V6的同时出现的。在11个月前发布的V5中,这两个功能都不存在。内核和运行时库(以及汇编器和C编译器)是用汇编编写的。

在V6版本中,calloc is implemented作为四行源代码模块:

calloc(n, s)
{
return(alloc(n*s));
}
calloc()不会清除分配的内存;参见 alloc() ,并且在V6中没有mancalloc()页面;但是man page for alloc() :



如果内存耗尽,甚至不会返回NULL!
calloc()与其他几个improvements一起首次正式出现在1979年1月的UNIX V7中:
  • calloc()清除返回的内存。
  • alloc()重命名为malloc()
  • realloc()出现
  • 在内存耗尽或发生堆错误的情况下,函数“返回空指针(0)”
  • 关于c - 在C函数中具有 "nmem"和 "size"参数有什么需求?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12862981/

    10-12 15:02