在我的机器上编译以下代码后,我发现了一些奇怪的事情:
#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;
}
结果如下。注意,每个int地址之间有4个字节的差异。但是,在最后一个int和长整数之间有12个字节的差异:
Hello, World!
The addresses are:
da54dcac
da54dca8
da54dca4
da54dca0
da54dc9c
da54dc98
da54dc94
da54dc88
不要使用内存地址之间的差异来确定大小。有一个
—
克里斯·施耐德
sizeof
功能。printf("size: %d ", sizeof(long));
您仅使用来打印地址的低4字节
—
Peter Cordes
%x
。幸运的是,它可以在您的平台上正常运行,以期望的格式字符串传递指针args unsigned int
,但是在许多ABI中,指针和整数的大小不同。用于%p
在可移植代码中打印指针。(很容易想象一个系统,您的代码将打印前四个指针的上半部分/下半部分,而不是所有8个指针的下半部分。)
—
导致
@luu不会散布错误信息。没有一个像样的编译器关心在C中声明变量的顺序。如果关心的话,就没有理由按照您的描述那样去做。
—
gnasher729
int
后h
的源代码。编译器可能会将它放在之前h
。