Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:为什么不';t&;(void*)和void**兼容吗?_C_Pointers_Incompatibility - Fatal编程技术网

C:为什么不';t&;(void*)和void**兼容吗?

C:为什么不';t&;(void*)和void**兼容吗?,c,pointers,incompatibility,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_

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

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
类型就是一个例子,但我实际上使用了多种类型,因此
某些函数必须接受
void**
,而不是
my_struct**
。每次我以上述方式调用
some_func
时,我都会收到以下警告,但我的代码运行正常

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

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

使用
void*
参数类型

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

void*
的意思是(有效地)“指向非类型内存区域的指针”

void**
实际上是指“指向内存区域的指针,其中包含指向非类型内存区域的指针”

注意中间块有一个类型--<代码>空隙*<代码>。您实际上是在传递一个不同类型的

mystruct*
数组。因此,编译器会警告您

);但它也适用于C语言。(<代码> Value*/CODE >就像所有指针类型的“基类”一样,考虑这样的代码:

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
}

请注意,
&(void*)
不是一件事<代码>和>代码>只是一个运算符,而不是类型的一部分。@ OLI:但是,在C中,这里的含义是非常明确的:(在C++中,当然它可能意味着其他东西)。感谢您的快速回复-我刚刚开始学习C。作为一个附带问题:
void**
是否有任何意义?也就是说,它有用吗?@Kninnug为什么没有任何意义?它是指向-
void
的指针。当。。。等等。。。你需要一个指向-
void
的指针。啊,比利·奥尼尔的答案更深入了这一点。我可能该上床睡觉了。@Kninnug:典型的情况是,当您需要返回一个
void*
,但已经将函数的返回值用于其他内容时——您最终使用了一个out参数,其类型为
void**
。(参见我的答案中的一个例子)“void*意味着(有效地)“指向非类型内存区域的指针”。——不是真的;它的意思是“指向内存区域的指针,其类型不是由指针指定的”。空指针引用的对象仍然可以具有声明的或有效的类型。@davmac:这就是我所说的“有效”:)我不认为在这里详细说明会有帮助。内存区域(或“对象”)不会因为
void*
指向它而(“有效”或其他)取消类型化。可能是“有效”的误用;我觉得这是值得澄清的。(我想)你的意思是,空指针并不表示它所指向的对象(或内存区域)的类型,这当然是正确的。@davmac:C标准描述了一个抽象机器,它与实际机器的行为方式非常不同。对于真正的机器来说,内存只是一堆比特。如果我们想要C标准技术描述正在发生的事情,我们必须提出存储持续时间,以及它对某个对象意味着什么,等等。;但所有这些都无助于回答这个问题,因此不适合描述高级概念性想法的答案。如果你不喜欢,那就投否决票;但我不会对此进行更改。@davmac:不,显然内存没有类型。内存没有类型。如果您想用C抽象机器来描述事物,那么就没有“内存”这类东西——只有具有给定存储时间的对象。但正如我之前所说,所有这些都与问题无关。