J'ai remarqué quelque chose d'étrange après avoir compilé ce code sur ma machine:
#include <stdio.h>
int main()
{
printf("Hello, World!\n");
int a,b,c,d;
int e,f,g;
long int h;
printf("The addresses are:\n %0x \n %0x \n %0x \n %0x \n %0x \n %0x \n %0x \n %0x",
&a,&b,&c,&d,&e,&f,&g,&h);
return 0;
}
Le résultat est le suivant. Notez qu'entre chaque adresse int, il y a une différence de 4 octets. Cependant, entre le dernier entier et le long entier, il y a une différence de 12 octets:
Hello, World!
The addresses are:
da54dcac
da54dca8
da54dca4
da54dca0
da54dc9c
da54dc98
da54dc94
da54dc88
sizeof
fonction pour ça. printf("size: %d ", sizeof(long));
%x
. Heureusement pour vous, il se trouve que cela fonctionne correctement sur votre plate-forme pour passer des arguments de pointeur avec une chaîne de format attendue unsigned int
, mais les pointeurs et les entrées sont de tailles différentes dans de nombreux ABI. Permet %p
d'imprimer des pointeurs en code portable. (Il est facile d'imaginer un système dans lequel votre code imprimerait les moitiés supérieure / inférieure des 4 premiers pointeurs, au lieu de la moitié inférieure des 8.)
%zu
. @yoyo_fun pour imprimer les adresses utilisées%p
. Utiliser le mauvais spécificateur de format appelle un comportement indéfini
int
aprèsh
dans le code source. Le compilateur peut le mettre dans l'espace, avanth
.