我想将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;