[英]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.