3

double *そのため、パラメーターの 1 つとして受け入れる関数に型を渡そうとしてvoid **います。これは私が受けている警告です。

incompatible pointer type passing 'double **' to parameter of type 'void **'

これが私のコードのスニペットです。

int main( void )
{
    //  Local Declaration
    double *target;

   //   Statement
   success = dequeue(queueIn, &target);
}

関数のプロトタイプ宣言は次のとおりです。

int    dequeue     ( QUEUE *queue, void **dataOutPtr );

target を 2 レベルのポインターとして渡せばうまくいくと思っていましたが、間違っていると思います。誰かが私にこの警告が表示される理由を説明してもらえますか?

4

3 に答える 3

5

他のすべてのポインター型は情報を失うことなく相互に変換できますが、他のポインターからポインターへの型void *には同じことは当てはまりませんvoid **。ポインターを逆参照する場合は、本物のオブジェクトvoid **を指している必要があります1void *

この場合、提供されたポインターを介して格納することによって単一のポインター値を返すと仮定するdequeue()と、正式に正しくするには、次のようにする必要があります。

int main( void )
{
    void *p;
    double *target;

    success = dequeue(queueIn, &p);
    target = p;

このように書くと、 からvoid *to への変換double *が明示的になり、コンパイラは必要なあらゆる魔法を実行できます (ただし、圧倒的に一般的なケースでは、魔法はまったくありません)。


1. ...またはchar *unsigned char *またはsigned char *オブジェクト。それらには特別なルールがあるためです。

于 2013-04-23T07:01:03.837 に答える
-1
int main( void )
{
    //  Local Declaration
    double *target;

   //   Statement
   success = dequeue(queueIn, (void**)&target);
}

このように使用してください。

于 2013-04-23T04:20:21.703 に答える