【发布时间】:2014-11-09 19:44:30
【问题描述】:
假设我有以下功能:
void *mycalloc(size_t num, size_t size, char *file, unsigned int line){
char *retptr = mymalloc((num * size), file, line);
if(!retptr){
return NULL;
}
else{
header *blk_header = (header *)retptr - 1;
for(int i=0; i<blk_header->size; i++){
retptr[i] = 0;
}
return retptr; //<-- at this point
}
}
函数头表示该函数将返回一个 void *,但是我的指针是一个 char *,因此我可以将每个字节设置为 0x00,这是 calloc 所要求的.在返回时将 retptr 强制转换为 void * 会是多余的,还是函数头确定返回的类型?我想我要问的是:这会对期望返回 void * 的调用者造成问题吗?
【问题讨论】:
-
是的,这将是多余的,因为
void *可以隐式转换为任何非限定对象指针类型。这也会降低可读性,因此实际上是有害的。另外,read this。 -
您可以考虑使用
memset来清零内存。它更有可能被优化,您不必担心不同的指针类型。 -
a
void*在 C 中将在适当时隐式转换为任何指针类型。这就是为什么你不投射malloc的返回值 -
@cHao 真有意思,没听说过
-
@TheParamagneticCroissant:哇,我不得不去看看那个。在使用 C 大约 10 年之后,我不知道这一点。还好我从来没有觉得有必要尝试它......