我使用64位ubuntu机器(x86_64)
我的大四已经告诉过,在C程序中,任何指针的大小总是等于int的大小。这是正确的吗?
但是当我执行sizeof(int)
时,我得到4个字节,而对于sizeof(int*)
我得到8个
1.为什么我在x86_64中获得sizeof(int)
的4个字节?
答案 0 :(得分:10)
我的大四学生告诉我,在C程序中,任何指针的大小总是等于int的大小。这是对的吗?
不,这不正确。
有multiple different memory models possible,通常在同一系统上同时进行。系统通常支持同时运行ILP32和LP64进程。虽然ILP32和LP64中int
为4字节(32位),但LP64中的指针为8字节(64位)。
答案 1 :(得分:9)
不,这不正确。
你的“老人”错了。你的编译器是正确的(显然)。
int
的大小和指针的大小因平台而异,并且它们不一定相同。实际上,在现代64位消费类硬件上,您可能会找到32位int
和64位指针。
答案 2 :(得分:5)
不要求指针的大小与int
的大小相同。事实上,指向不同类型的指针不必具有相同的大小:
6.2.5类型
...
28指向void
的指针应具有与指向字符类型的指针相同的表示和对齐要求。 48)同样,指向兼容类型的限定或非限定版本的指针应具有相同的表示形式和对齐要求。所有指向结构类型的指针都应具有相同的表示和对齐要求。所有指向union类型的指针都应具有相同的表示和对齐要求。指向其他类型的指针不需要具有相同的表示或对齐要求。 48)相同的表示和对齐要求意味着可互换性作为函数的参数,函数的返回值和联合的成员。
对于C ++,请参阅online C++ Standard,第3.9.2节,第3段。
在32位计算机上,指针类型和int
的大小相同,但它并不普遍(特别是当我们转向64位架构时)。
答案 3 :(得分:4)
可以保存指针的整数类型是intptr_t
,在<stdint.h>
中定义。