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

Dou*_* II 5 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);
}
Run Code Online (Sandbox Code Playgroud)

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

warning: passing argument 1 of ‘my_func’ from incompatible pointer type
Run Code Online (Sandbox Code Playgroud)

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

oua*_*uah 10

使用void *参数类型.

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

  • @Kninnug为什么不是什么意思?它是一个指针指向``void`的指针.当......等待它时,它是有用的......你需要一个指针指向``void`. (3认同)
  • @Kninnug:一个典型的场景是当你需要返回一个`void*`但是已经使用了函数的返回值时,你最终会使用一个out参数,它的类型为`void**`.(以我的答案为例) (2认同)

Bil*_*eal 5

void*意味着(实际上)“指向无类型内存区域的指针”。

void**意味着(实际上)“指向内存区域的指针,其中包含指向非类型化内存区域的指针”。

请注意中间的块如何具有类型——一个void*. 您实际上传递的mystruct*是一个不同类型的数组。所以你的编译器会警告你。

当尝试转换Derived**Base**;时,C++ 中也会出现类似的问题。但它也适用于 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
}
Run Code Online (Sandbox Code Playgroud)