Tôi nhận thấy một điều kỳ lạ sau khi biên dịch mã này trên máy của mình:
#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;
}
Kết quả là như sau. Lưu ý rằng giữa mỗi địa chỉ int có sự khác biệt 4 byte. Tuy nhiên, giữa int cuối cùng và int dài có sự khác biệt 12 byte:
Hello, World!
The addresses are:
da54dcac
da54dca8
da54dca4
da54dca0
da54dc9c
da54dc98
da54dc94
da54dc88
sizeof
chức năng cho điều đó. printf("size: %d ", sizeof(long));
%x
. May mắn cho bạn, nó hoạt động chính xác trên nền tảng của bạn để vượt qua con trỏ đối số với một chuỗi định dạng mong đợi unsigned int
, nhưng con trỏ và int là các kích cỡ khác nhau trong nhiều ABI. Sử dụng %p
để in con trỏ trong mã di động. (Thật dễ dàng để tưởng tượng một hệ thống trong đó mã của bạn sẽ in nửa trên / dưới của 4 con trỏ đầu tiên, thay vì nửa dưới của tất cả 8.)
%zu
. @yoyo_fun để in địa chỉ sử dụng%p
. Sử dụng trình xác định định dạng sai sẽ gọi hành vi không xác định
int
sauh
trong mã nguồn. Trình biên dịch có thể đặt nó vào khoảng trống, trước đóh
.