tipo de puntero incompatible en C

así que estoy tratando de pasar un tipo double * a una función que acepta void ** como uno de los parámetros. Esta es la advertencia que estoy recibiendo.

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

Aquí hay un fragmento de mi código.

 int main( void ) { // Local Declaration double *target; // Statement success = dequeue(queueIn, &target); } 

Aquí está la statement del prototipo de la función.

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

Pensé que si pasaba el objective como un indicador de dos niveles funcionaría, pero supongo que estoy equivocado. ¿Alguien por favor me puede explicar por qué recibo esta advertencia?

Aunque todos los demás tipos de punteros pueden convertirse void * desde void * sin pérdida de información, no ocurre lo mismo con void ** y otros tipos de puntero a puntero; si elimina la referencia a un puntero void ** , debe estar apuntando a un objeto void * genuino 1 .

En este caso, suponiendo que dequeue() está devolviendo un solo valor de puntero almacenándolo a través del puntero proporcionado, para que sea formalmente correcto, tendría que hacer:

 int main( void ) { void *p; double *target; success = dequeue(queueIn, &p); target = p; 

Cuando lo escribes así, la conversión de void * a double * es explícita, lo que permite al comstackdor hacer cualquier magia que sea necesaria (aunque en el caso más común, no hay magia en absoluto).


1. … o un objeto char * , unsigned char * o signed char * , porque hay una regla especial para ellos.

En su statement de prototipo, dijo el segundo argumento como void** , por lo que debe escribir cast doublee** para void** . En lugar de esta línea success = dequeue(queueIn, &target); .

Llamar así success = dequeue(queueIn,(void**) &target);

 int main( void ) { // Local Declaration double *target; // Statement success = dequeue(queueIn, (void**)&target); } 

Úsalo así.