0

我必须使用以下签名为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?
}

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

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

4

3 回答 3

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(加上检查)的结果。

但是,请注意 anint*与 a 不同void*,因此您不能仅将xoff 的地址作为 void 指针的地址传递。相反,您需要:

void * p;
my_malloc(&p);
int * x = p;  // conversion is OK
于 2012-06-23T19:22:53.617 回答
2

与 相反void *,该类型void **不是通用指针类型,因此如果类型不同,则需要在赋值之前进行强制转换。

于 2012-06-23T19:20:04.677 回答
0
void ** ptr

这里,“ptr”是指向指针的指针,可以被视为指向指针数组的指针。由于您的结果存储在那里(mymalloc 没有返回任何内容),您需要澄清您希望分配到“ptr”中的内容。参数“大小”不是一个充分的描述。

于 2012-06-23T19:23:29.700 回答