我必须为malloc
mymalloc
实现一个包装器,并使用以下签名:
void mymalloc(int size, void ** ptr)
是否需要void**
,以便在主程序中不需要类型转换,并且正确指针(无类型转换)的所有权保留在main()
中。
void mymalloc(int size, void ** ptr)
{
*ptr = malloc(size) ;
}
main()
{
int *x;
mymalloc(4,&x); // do we need to type-cast it again?
// How does the pointer mechanism work here?
}
现在,传递的指针是否需要再次进行类型转换,还是会隐式进行类型转换?
我不明白这是如何工作的。
malloc
返回一个void*
。对于您的函数,用户应首先创建自己的局部void*
变量,并为您提供指向它的指针;然后,您的函数应填充该变量。因此,签名中有一个额外的指针,函数中有一个取消引用,客户端代码中有一个地址运算符。
原型模式是这样的:
void do_work_and_populate(T * result)
{
*result = the_fruits_of_my_labour;
}
int main()
{
T data; // uninitialized!
do_work_and_populate(&data); // pass address of destination
// now "data" is ready
}
对于您的使用示例,替换T = void *
,您的劳动成果是malloc
(加上检查)的结果。
但是,请注意,int*
与 void*
不同,因此您不能仅将 x
的地址作为 void 指针的地址传递。相反,您需要:
void * p;
my_malloc(&p);
int * x = p; // conversion is OK
与void *
相反,类型void **
不是泛型指针类型,因此如果类型不同,则需要在赋值之前强制转换。
void ** ptr
在这里,"ptr"是指向指针的指针,可以被视为指向指针数组的指针。 由于您的结果存储在那里(没有从 mymalloc 返回任何内容),因此您需要澄清您希望分配给"ptr"的内容。 参数"大小"不足以描述。