Percebi algo estranho depois de compilar esse código na minha 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;
}
O resultado é o seguinte. Observe que entre todos os endereços int há uma diferença de 4 bytes. No entanto, entre o último int e o int longo, há uma diferença de 12 bytes:
Hello, World!
The addresses are:
da54dcac
da54dca8
da54dca4
da54dca0
da54dc9c
da54dc98
da54dc94
da54dc88
sizeof
função para isso. printf("size: %d ", sizeof(long));
%x
. Para sua sorte, acontece que funcione corretamente em sua plataforma para passar argumentos de ponteiro com uma sequência de formato unsigned int
esperada, mas ponteiros e ints são de tamanhos diferentes em muitas ABIs. Use %p
para imprimir ponteiros em código portátil. (É fácil imaginar um sistema em que o código seria imprimir superior / metades inferiores das primeiras 4 ponteiros, em vez de metade inferior de todos os 8.)
%zu
. @yoyo_fun para imprimir endereços de uso%p
. Usando o especificador formato errado invoca um comportamento indefinido
int
depoish
no código fonte. O compilador pode colocá-lo na lacuna, antesh
.