我必须使用以下签名为名为malloc
的{{1}}实现一个包装器:
mymalloc
是否需要void mymalloc(int size, void ** ptr)
以便主程序中不需要任何类型转换,并且正确指针(没有类型转换)的所有权保留在void**
中。
main()
现在,传递的指针是否需要再次进行类型转换,还是会隐式进行类型转换?
我不明白这是如何运作的。
答案 0 :(得分:3)
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
答案 1 :(得分:2)
与void *
相反,类型void **
不是通用指针类型,因此如果类型不同,则需要在赋值之前进行转换。
答案 2 :(得分:0)
void ** ptr
这里,“ptr”是指向指针的指针,可以视为指向指针数组的指针。由于您的结果存储在那里(mymalloc没有返回任何内容),您需要澄清您希望分配到“ptr”的内容。 “大小”这个论点不够充分。