incompatible pointer type en C
donc je suis en train de passer d'un type de double *
à une fonction qui accepte void **
comme l'un des paramètres. C'est l'avertissement que je reçois.
incompatible pointer type passing 'double **' to parameter of type 'void **'
Voici un extrait de mon code.
int main( void )
{
// Local Declaration
double *target;
// Statement
success = dequeue(queueIn, &target);
}
Voici le prototype de la déclaration de la fonction.
int dequeue ( QUEUE *queue, void **dataOutPtr );
J'ai pensé que si je passais la cible en deux au niveau du pointeur que cela pourrait fonctionner, mais je suppose que je me trompe. Quelqu'un peut-il m'expliquer comment se fait-je suis de cet avertissement?
- Le type de signature pour la file d'attente attentes pointeur vers un pointeur. Regardez à nouveau.
- double possible de Est nulle** acceptable de type ANSI-C?
- ideone.com/VGvqFe
- C'est très probablement un doublon de stackoverflow.com/questions/246280/...
- Consulter les liens ci-dessus(par moi et Cody Gris).Vous pourrez trouver de bonnes réponses à cette question.
- Donc, vous avez résolu le casting de l'émission. Le plus gros problème est probablement ce formulaire de données de la
dequeue
fonction attend. Je parie que ce n'est pas un pointeur vers un pointeur non initialisée à double.
Vous devez vous connecter pour publier un commentaire.
Même si tous les autres types de pointeur peut être converti et de
void *
sans perte d'information, ce n'est pas vrai devoid **
et d'autres pointeur de pointeur de types; si vous déréférencer unvoid **
un pointeur, il faut pointer une véritablevoid *
objet1.Dans ce cas, en supposant que
dequeue()
est de retourner une seule valeur du pointeur en les stockant à travers des pointeur, pour être formellement correct, vous devrez faire:Lorsque vous écrivez comme ça, la conversion de
void *
àdouble *
est explicite, ce qui permet au compilateur de faire de la magie c'est nécessaire (même si, dans la très grande majorité des cas communs, il n'y a pas de magie à tous).1. ...ou un
char *
,unsigned char *
ousigned char *
objet, parce qu'il y a une règle spéciale pour les personnes.Dans votre prototype déclaration , vous avez dit deuxième argument comme
void**
,de sorte que vous avez ce type de fontedouble**
àvoid**
.Au lieu de cette ligne
success = dequeue(queueIn, &target);
.Appeler comme ça
success = dequeue(queueIn,(void**) &target);
void*
, mais pas pour le double pointeurvoid**
. Les détails sont ici.void*
comme argument et libre, la mémoire, l'autre pourrait prendrevoid**
comme argument et gratuit ainsi que de réinitialiser le pointeur. Si vous l'appelez sans un casting il utilise toujours lavoid*
-variante, même si vous avez passé la référence d'un pointeur qui a donné lieu, en libérant de l'UB. Je voudrais éviter devoid**
tout à fait.doublee**
àvoid**
": -1.Utiliser de la sorte.