Pointeur ne fonctionnera pas en printf()

Avoir un problème avec l'impression d'un pointeur. Chaque fois que j'essaie et 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 est évident que je manque quelque chose de simple ici, mais d'autres exemples de code similaire que j'ai vu, cela devrait fonctionner.

Voici le code, toute aide serait super!

#include <stdio.h>

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

       pt1 = &x;

       printf("Value at p1: %dn", *pt1);
       printf("Address of p1: %pn", pt1);

       return 0;
    }
28
demandé sur Chris 2011-03-24 13:48:38

4 réponses

il suffit de lancer votre pointeur int sur un nul:

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

Votre code est sûr, mais vous compilez avec l' -Wformat drapeau d'avertissement, qui Tapera vérifier les appels à printf() et scanf().

41
répondu Macmade 2011-03-24 10:50:40

notez que vous recevez un simple avertissement. Votre code sera probablement exécuter comme prévu.

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

l'avertissement est bon parce que int* et void* may, sur les implémentations étranges, ont des tailles différentes ou des motifs de bits ou quelque chose.

convertissez le int*void* avec un casting ...

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

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

10
répondu pmg 2011-03-24 12:33:11

dans ce cas, le compilateur est un peu trop lent avec les Avertissements. Votre code est parfaitement sûr, vous pouvez éventuellement supprimer l'avertissement avec:

printf("Address of p1: %p\n", (void *) pt1);
1
répondu Erik 2011-03-24 10:51:10

Le message dit tout, mais c'est juste un avertissement, pas une erreur en soi:

printf("Address of p1: %p\n", (void*)pt1);
1
répondu karlphillip 2011-03-24 10:51:23