web-dev-qa-db-fra.com

Le pointeur ne fonctionnera pas dans printf ()

Avoir un problème avec l'impression d'un pointeur. Chaque fois que j'essaie de compiler le programme ci-dessous, j'obtiens l'erreur suivante:

pointers.c:11: warning: format ‘%p’ expects type ‘void *’, but argument 2 has type ‘int *’

Il me manque évidemment quelque chose de simple ici, mais à partir d'autres exemples de code similaire que j'ai vu, cela devrait fonctionner.

Voici le code, toute aide serait formidable!

#include <stdio.h>

    int main(void)
    {
       int x = 99;
       int *pt1;

       pt1 = &x;

       printf("Value at p1: %d\n", *pt1);
       printf("Address of p1: %p\n", pt1);

       return 0;
    }
31
Chris

Transformez simplement votre pointeur int en un vide:

printf( "Address of p1: %p\n", ( void * )pt1 );

Votre code est sûr, mais vous compilez avec l'indicateur d'avertissement -Wformat, Qui tapera check les appels à printf() et scanf().

45
Macmade

Notez que vous obtenez un simple avertissement. Votre code --- probablement s'exécutera comme prévu.

Le "%p" le spécificateur de conversion en printf attend un void* argument; pt1 est de type int*.

L'avertissement est bon car int* et void* peut, sur des implémentations étranges, avoir différentes tailles ou modèles de bits ou quelque chose .

Convertissez le int* à un void* avec un casting ...

printf("%p\n", (void*)pt1);

... et tout ira bien, même sur des implémentations étranges.

10
pmg

Dans ce cas, le compilateur est juste un peu exagéré avec les avertissements. Votre code est parfaitement sûr, vous pouvez éventuellement supprimer l'avertissement avec:

printf("Address of p1: %p\n", (void *) pt1);
2
Erik

Le message dit tout, mais ce n'est qu'un avertissement et non une erreur en soi:

printf("Address of p1: %p\n", (void*)pt1);
1
karlphillip