将 malloc() 转换为 calloc()

标签 c malloc type-conversion calloc

我想将 malloc() 转换为 calloc()。我对在这个例子中使用 calloc() 感到困惑,因为它需要 2 个参数,而 malloc() 只有一个。所以这对我来说是正确的:

(byteBuffer)calloc(sizeof(byteBufferStruct), len + 1));

例子:

typedef struct byte_buf {
    size_t  len;
    uint8_t  *bytes;
} byteBufferStruct, *byteBuffer;


byteBuffer mallocByteBuffer(size_t len)
{
    byteBuffer retval;
    if((retval = (byteBuffer) malloc(sizeof(byteBufferStruct) + len + 1)) == NULL) return NULL;
    retval->len = len;
    retval->bytes = (uint8_t *) (retval + 1) ; /* just past the byteBuffer in malloc'ed space */
    return retval;
}

最佳答案

首先:malloc()calloc() 都返回void *,在C 中表示you should not cast the return value .

比较函数的签名,我们有:

  • void * malloc(size_t size);
  • void * calloc(size_t nmemb, size_t size);

基本上,malloc() 的参数是 calloc() 的参数的乘积。

您可以通过将其中之一设置为 1 来进行转换:

void * malloc_to_calloc(size_t size)
{
   return calloc(1, size);
}

由于 nmemb(成员数)到 calloc() 不会以任何方式影响内存的实际结构,所以这是安全的。

现在我们可以使用它来实现您的分配功能(为清楚起见):

byteBuffer mallocByteBuffer(size_t len)
{
  byteBuffer b = malloc_to_calloc(len + 1 + sizeof *b);
  if(b != NULL)
  {
    b->len = len;
    b->bytes = (uint8_t *) (b + 1);
  }
  return b;
}

请注意,sizeof 不是一个函数。另请注意,当您 typedef 去掉星号时,星号明显不对称。我不建议这样做。

关于将 malloc() 转换为 calloc(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20652479/

相关文章:

C# 将任何格式字符串转换为 double

SAS:将字符转换为数字变量 - 逗号作为小数点分隔符

java - 将 int 转换为十六进制字符串需要更好的方法

c - 如果我可以通过 C 中的指针修改它,那么 const 限定符的目的是什么?

c - 结构体数组 - 哈希表

c - malloc() 对于结构中的指针不会将内存绑定(bind)到声明的大小

java - 比较 float 及其副本

c - 可变参数宏不起作用

c - 如何阻止 gcc 将带有标准库路径的 -L 传递给链接器

c - 程序没有结束并且什么也没有发生