簡體   English   中英

void **和void *的編譯警告

[英]Compilation warning for void ** and void *

我有一個關於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;
}

void *a表示a指向未知類型的對象。 然而, a因為本身並不是一個未知類型a已知具有類型void* 只有對象a指向具有未知類型。

void **a意味着a指向類型的對象void* *a指向的對象具有未知類型,但對象*a本身是類型為void*的指針。

&y是指向float*類型的對象的指針。 &y不是指向void*類型的對象的指針。

C ++標准允許任何指針隱式轉換 void* 但是, void**void* ; 它是指向void*的指針。 因此,它屬於常規指針轉換的規則(即:禁止使用強制轉換,但有一些例外)。

添加到其他答案中的信息, void*在C中充當通用指針類型。有些東西是通用的:任何指針(指向函數的指針類型)都可以轉換為void *並返回再次沒有信息丟失,並且指針表達式(再次,除了指向函數的指針)可以隱式轉換為void* (C ++的規則略有不同。)

您可能認為void**是指向指針的通用類型,但事實並非如此。 它是指向特定類型的指針,即void* 實際上,C沒有通用的指針指針類型。 但它確實有一個通用的指針類型,因此任何試圖使用void**作為通用指針指針類型的代碼都可能只使用void*

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM