2016-09-09 8 views
0

私は、次のコードに出くわした、0C Programming-ポインタ

された出力は、文ですvptr = &i正しいですか?整数変数のアドレスvoidポインタを割り当てることはできますか?

#include<stdio.h> 

void fun(void *p); 
int i; 

int main() 
{ 
    void *vptr; 
    vptr = &i; 
    fun(vptr); 
    return 0; 
} 
void fun(void *p) 
{ 
    int **q; 
    q = (int**)&p; 
    printf("%d\n", **q); 
} 
+0

_ "正しい" _を定義してください。構文?セマンティクス?使用法?動作?練習? –

+0

voidポインタに何かのメモリアドレスを割り当てることができます。 – element11

+0

@SouravGhosh正しいことは、その動作を意味します。上記のステートメントを使用して整数型のメモリをvoidに割り当てることはできますか? –

答えて

8

vptr = &i;は問題ありません。

ただし、文q = (int**)&p;は正しくありません。 &pint*を指さず、void*を指しています。 int*void*に互換性のあるレイアウトがあることは保証されていません。

funの正しい実装は、任意のポインタ型がvoid*に変換することができる

void fun(void *p) 
{ 
    printf("%d\n", *(int*)p); 
} 
0

あろう。 C standard 6.3.2.3p1から:

voidへのポインタは、任意のオブジェクト タイプへのポインタにまたはから変換することができます。任意のオブジェクト型へのポインタは、 voidへのポインタに変換され、再び戻されます。結果は元の ポインタと等しいと比較されます。