C语言 在函数中使用 void** 作为参数是什么用



我必须为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"的内容。 参数"大小"不足以描述。

相关内容

  • 没有找到相关文章

最新更新