C:为什么&(void *)和void **不兼容?

时间:2013-12-24 00:24:29

标签: c pointers incompatibility

虽然我的代码功能正常,但我收到了一个不兼容的指针类型错误警告。首先,这是我的代码的简化版本:

typedef struct {
    int field1;
    int field2;
} my_struct;

void some_function(void **data){
    // do something with *data
}

int main(int argc, char *argv[]){
    my_struct *ptr = malloc(sizeof(my_struct));
    ptr->field1 = 5;
    ptr->field2 = 17;
    some_function(&ptr);
}

my_struct类型是一个示例,但我实际上使用的是多种类型,因此some_func必须接受void**,而不是my_struct**。每次我按上述方式拨打some_func时,都会收到以下警告,但我的代码功能正常。

warning: passing argument 1 of ‘my_func’ from incompatible pointer type

我不确定为什么这些类型不兼容,并希望以某种方式删除警告。要获得答案,请随时解释为什么会发生这种情况,如果可能的话,如何删除警告(可能是cpp指令?)。谢谢!

2 个答案:

答案 0 :(得分:10)

使用void *参数类型。

void **不是通用指针类型。 void *是。

答案 1 :(得分:4)

void*表示(有效地)“指向无类型内存区域的指针”。

void**表示(有效地)“指向内存区域的指针,其中包含指向无类型内存区域的指针”。

注意中间的块有一个类型 - void*的数组。你有效地传递了一个mystruct*数组,这是一个不同的类型。所以你的编译器警告你。

Similar issues occur in C++ when trying to convert Derived** to Base**;但它也适用于C语言。 (void*的操作类似于所有指针类型的“基类”)考虑一段这样的代码:

void does_things(void** outParameter)
{
    *outParameter = malloc(42); // Looks fine; writing void* to void* :)
}

int main()
{
    my_struct* x = /*...*/;
    does_things(&myStruct); // Ut oh, tries to make x point to
                            // something that is *not* a my_struct
}
相关问题