Saya perhatikan ada yang aneh setelah kompilasi kode ini di komputer saya:
#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;
}
Hasilnya adalah sebagai berikut. Perhatikan bahwa antara setiap alamat int ada perbedaan 4-byte. Namun antara int terakhir dan int panjang ada perbedaan 12 byte:
Hello, World!
The addresses are:
da54dcac
da54dca8
da54dca4
da54dca0
da54dc9c
da54dc98
da54dc94
da54dc88
sizeof
fungsi untuk itu. printf("size: %d ", sizeof(long));
%x
. Beruntung bagi Anda, itu terjadi untuk bekerja dengan benar pada platform Anda untuk melewatkan pointer pointer dengan format string yang diharapkan unsigned int
, tetapi pointer dan int adalah ukuran yang berbeda di banyak ABI. Gunakan %p
untuk mencetak petunjuk dalam kode portabel. (Sangat mudah untuk membayangkan suatu sistem di mana kode Anda akan mencetak bagian atas / bawah dari 4 petunjuk pertama, bukan setengah dari semua 8.)
%zu
. @yoyo_fun untuk mencetak alamat yang digunakan%p
. Menggunakan format specifier yang salah memunculkan perilaku yang tidak terdefinisi
int
setelahh
dalam kode sumber. Compiler mungkin meletakkannya di celah, sebelumnyah
.