尽管我的代码运行正常,但我收到了不兼容的指针类型错误警告。首先,这是我的代码的简化版本:
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指令?)。谢谢!
最佳答案
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
}