Nach dem Kompilieren dieses Codes auf meinem Computer ist mir etwas Merkwürdiges aufgefallen:
#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;
}
Das Ergebnis ist das Folgende. Beachten Sie, dass zwischen jeder int-Adresse ein Unterschied von 4 Byte besteht. Zwischen dem letzten int und dem langen int besteht jedoch ein Unterschied von 12 Byte:
Hello, World!
The addresses are:
da54dcac
da54dca8
da54dca4
da54dca0
da54dc9c
da54dc98
da54dc94
da54dc88
sizeof
Funktion. printf("size: %d ", sizeof(long));
%x
. Glücklicherweise funktioniert es auf Ihrer Plattform ordnungsgemäß, Zeigerargumente mit einer erwarteten unsigned int
Formatzeichenfolge zu übergeben, aber Zeiger und Ints sind in vielen ABIs unterschiedlich groß. Verwenden Sie %p
Zeiger in portablen Code zu drucken. (Es ist leicht vorstellbar, dass Ihr Code die oberen / unteren Hälften der ersten 4 Zeiger anstelle der unteren Hälfte aller 8 druckt.)
%zu
. @yoyo_fun zum Drucken von Adressen verwenden%p
. Die Verwendung des falschen
int
afterh
in den Quellcode ein. Der Compiler kann es vorher in die Lücke setzenh
.