指针的大小始终等于C编译器中int的大小.这是对的吗?

Bha*_*rya 2 c c++ linux ubuntu operating-system

我使用64位ubuntu机器(x86_64).
我的大四已经告诉过,在C程序中,任何指针的大小总是等于int的大小.这是对的吗 ?
但是当我执行时,sizeof(int)我得到4个字节,因为sizeof(int*)我得到8 个字节.
1.为什么sizeof(int)我的x86_64中有4个字节?

And*_*nle 10

我的大四已经告诉过,在C程序中,任何指针的大小总是等于int的大小.这是对的吗?

不,那是不对的.

存在多种不同的存储器模型,通常在同一系统上同时存在.系统通常支持同时运行ILP32和LP64进程.虽然intILP32和LP64中的4个字节(32位),但LP64中的指针是8个字节(64位).


Lig*_*ica 9

不,这不对.

你的"老人"错了.你的编译器是正确的(显然).

的尺寸int和一个指针的大小跨平台而变化,它们并不一定是相同的.实际上,在现代64位消费类硬件上,您可能会找到32位int和64位指针.


小智 7

可以保存指针的整数类型是intptr_t,在 中定义<stdint.h>

  • 无论如何,这都是一个很好的信息。 (5认同)
  • 这不是答案,而是评论。 (2认同)

Joh*_*ode 5

没有要求指针总是与a相同int.实际上,指向不同类型的指针不必具有彼此相同的大小:

在线C 2011标准

6.2.5类型
...
28指针void应具有与指向字符类型的指针相同的表示和对齐要求.48)类似地,指向兼容类型的合格或非限定版本的指针应具有相同的表示和对齐要求.所有指向结构类型的指针都应具有相同的表示和对齐要求.所有指向union类型的指针都应具有相同的表示和对齐要求.指向其他类型的指针不需要具有相同的表示或对齐要求.
48)相同的表示和对齐要求意味着可互换性作为函数的参数,函数的返回值和联合的成员.

对于C++,请参阅在线C++标准,第3.9.2节,第3段.

在32位机器上,它通常用于指针类型并且int大小相同,但它并不普遍(特别是当我们转向64位体系结构时).