c-将malloc()转换为calloc()



我想将malloc()转换为calloc()。我对在这个例子中使用calloc()感到困惑,因为它需要两个参数,而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中意味着不应该强制转换返回值。

比较函数的签名,我们得到:

  • 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去掉星号时,你会得到明显的星号不对称性。我不建议你那样做。

而不是进行

if((retval = (byteBuffer) malloc(sizeof(byteBufferStruct) + len + 1)) == NULL) return NULL;

进行

if (NULL == (retval = calloc(1, sizeof(byteBufferStruct) + len + 1))) 
  return NULL;

相关内容

  • 没有找到相关文章

最新更新