Utilisation de pointeurs vides sur différentes plates-formes

J’ai entendu dire que les pointeurs devraient d’abord être supprimés pour assurer la cohérence des valeurs sur différentes plates-formes et qu’ils devraient utiliser le spécificateur de format %p . Pourquoi est-ce et quels sont exactement les problèmes?

 int x=100; int *pi=&x; printf("value of pi is: %p",(void*)pi); 

printf est une fonction variadique et doit recevoir les arguments des types appropriés. La norme indique que %p prend void * .

La conversion implicite n’a pas lieu pour les fonctions variadiques .

Citant de N1570 7.21.6.1 La fonction fprintf

p: l’argument doit être un pointeur sur void. La valeur du pointeur est convertie en une séquence de caractères d’impression, d’une manière définie par l’implémentation.

La présentation interne ou la taille des différents types de pointeurs n’est pas nécessairement la même.

Par exemple, sur un système, sizeof(void*) peut être 2, mais sizeof(int*) est sizeof(int*) 1.

Comme printf est une fonction à argument variable, il ne peut pas vérifier les types de parameters entrants. Si vous lui passiez int* , il lirait un nombre incorrect d’octets, car il attend void* .

p spécification de conversion dans printf nécessite un argument de type void * . C dit que si vous passez un argument d’un autre type, l’appel invoque un comportement indéfini.

De plus, les objects pointeurs de types différents ne doivent pas nécessairement avoir la même représentation: C ne garantit pas que sizeof (void *) == sizeof (int *) par exemple. C ne garantit que que void * a la même représentation que les pointeurs sur les types de caractères.