Zauważyłem coś dziwnego po skompilowaniu tego kodu na moim komputerze:
#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;
}
Wynik jest następujący. Zauważ, że między każdym adresem int występuje 4-bajtowa różnica. Jednak między ostatnim intem a długim intem istnieje 12-bajtowa różnica:
Hello, World!
The addresses are:
da54dcac
da54dca8
da54dca4
da54dca0
da54dc9c
da54dc98
da54dc94
da54dc88
sizeof
funkcja. printf("size: %d ", sizeof(long));
%x
. Na szczęście dla ciebie, zdarza się, że działa poprawnie na twojej platformie, aby przekazywać argumenty wskaźnikowe z oczekiwanym ciągiem formatu unsigned int
, ale wskaźniki i liczby całkowite mają różne rozmiary w wielu ABI. Służy %p
do drukowania wskaźników w przenośnym kodzie. (Łatwo jest wyobrazić sobie system, w którym kod drukowałby górną / dolną połowę pierwszych 4 wskaźników zamiast dolnej połowy wszystkich 8.)
%zu
. @yoyo_fun do drukowania adresów użyj%p
. Użycie niewłaściwego specyfikatora formatu wywołuje niezdefiniowane zachowanie
int
poh
w kodzie źródłowym. Kompilator może wcześniej wstawić go do lukih
.