首页 文章

void **和void *的编译警告

提问于
浏览
4

我有一个关于 void*void** 的问题,我知道这是一个老问题,并且在stackoverflow之前已经被问过(有点) . 所以问题如下:

当我在ubuntu 10.10下使用gcc 4.4.3编译此代码时,我收到以下警告:

zz.c: In function ‘main’:
zz.c:21: warning: passing argument 1 of ‘bar’ from incompatible pointer type
zz.c:9: note: expected ‘void **’ but argument is of type ‘float **’

为什么将变量x作为foo()的参数传递是可以的,但它不能将变量y作为bar()的参数传递 . 我可以通过将两个变量显式地转换为 void*void** 来解决这个问题 .

void foo (void* a){
}

void bar(void **a){
     *a = (float *) malloc(100*sizeof(float));
}

int main (){

    float *x = (float*) malloc(100*sizeof(float));
    foo(x);
    free(x);

    float *y;
    bar(&y);
    free(y);

    return 0;
}

3 回答

  • 10

    void *a 表示 a 指向未知类型的对象 . 但是, a 本身不是未知类型,因为已知 a 具有类型 void* . 只有 a 指向的对象具有未知类型 .

    void **a 表示 a 指向 void* 类型的对象 . *a 指向的对象具有未知类型,但对象 *a 本身是类型为 void* 的指针 .

    &y 是指向 float* 类型的对象的指针 . &y 不是指向 void* 类型对象的指针 .

  • 6

    C标准允许任何指针隐式转换为 void* . 但 void**void* 不是一回事;它是一个指向 void* 的指针 . 因此,它属于常规指针转换的规则(即:禁止使用强制转换,但有一些例外) .

  • 3

    添加到其他答案中的信息, void* 充当C中的通用指针类型 . 有一些关于它的通用:任何指针(指向函数的指针类型)都可以转换为void *并再次返回在不丢失信息的情况下,指针表达式(同样,除了指向函数的指针)可以隐式转换为 void* . (C的规则略有不同 . )

    您可能认为 void** 是指向指针的通用类型,但它不是't. It'指向特定类型的指针,即 void* . 实际上,C没有通用的指针指针类型 . 但它确实有一个通用指针类型,因此任何试图使用 void** 作为通用指针指针类型的代码都可能只使用 void* .

相关问题