void **作为函数中的参数有什么用?

时间:2012-06-23 19:14:11

标签: c pointers malloc

我必须使用以下签名为名为malloc的{​​{1}}实现一个包装器:

mymalloc

是否需要void mymalloc(int size, void ** ptr) 以便主程序中不需要任何类型转换,并且正确指针(没有类型转换)的所有权保留在void**中。

main()

现在,传递的指针是否需要再次进行类型转换,还是会隐式进行类型转换?

我不明白这是如何运作的。

3 个答案:

答案 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”的内容。 “大小”这个论点不够充分。