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