因为在许多
64 bits机器(例如x86-64)上用于常见的GCC编译器sizeof(int)== 4但是sizeof(void *)== 8&&的sizeof(长)== 8;这被称为I32LP64(或只是LP64)
data model
例如,在Linux / x86-64系统上编译并运行以下程序:
#include
#include
int main ()
{
printf ("sizeof(int)=%d\n", (int) sizeof (int));
printf ("sizeof(intptr_t)=%d\n", (int) sizeof (intptr_t));
printf ("sizeof(short)=%d\n", (int) sizeof (short));
printf ("sizeof(long)=%d\n", (int) sizeof (long));
printf ("sizeof(long long)=%d\n", (int) sizeof (long long));
printf ("sizeof(void*)=%d\n", (int) sizeof (void *));
return 0;
}
在我的系统上使用gcc -Wall s.c -o编译并在我的Debian / Sid / x86-64(i3770k处理器,GCC 4.8.2)上运行./s:
sizeof(int)=4
sizeof(intptr_t)=8
sizeof(short)=2
sizeof(long)=8
sizeof(long long)=8
sizeof(void*)=8
在32位模式下使用gcc -m32 -Wall s.c -o s32编译并运行./s32:
sizeof(int)=4
sizeof(intptr_t)=4
sizeof(short)=2
sizeof(long)=4
sizeof(long long)=8
sizeof(void*)=4
如果使用gcc -mx32 -O3 -Wall s.c -o sx32编译x32,我得到相同的输出!
BTW,也许更好的问题是为什么不使用intptr_t ….我不知道(可能是一个习惯问题; when Linus首先开始编写他的内核,C99标准定义< stdint.h>和intptr_t-不存在).