Noté algo extraño después de compilar este código en mi máquina:
#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;
}
El resultado es el siguiente. Observe que entre cada dirección int hay una diferencia de 4 bytes. Sin embargo, entre el último int y el int largo hay una diferencia de 12 bytes:
Hello, World!
The addresses are:
da54dcac
da54dca8
da54dca4
da54dca0
da54dc9c
da54dc98
da54dc94
da54dc88
sizeof
función para eso. printf("size: %d ", sizeof(long));
%x
. Afortunadamente para ti, funciona correctamente en tu plataforma para pasar argumentos de puntero con una cadena de formato esperada unsigned int
, pero los punteros y las entradas son de diferentes tamaños en muchas ABI. Úselo %p
para imprimir punteros en código portátil. (Es fácil imaginar un sistema en el que su código imprima las mitades superior / inferior de los primeros 4 punteros, en lugar de la mitad inferior de los 8).
%zu
. @yoyo_fun para imprimir el uso de direcciones%p
. El uso del especificador de formato incorrecto invoca un comportamiento indefinido
int
despuésh
en el código fuente. El compilador puede ponerlo en el vacío, antesh
.