为什么sizeof(int)与sizeof(int*)不同?

6
我想知道为什么在以下程序中,sizeof(int)返回的值与sizeof(int*)不同。

这是一个小程序:
int main(){
    std::cout<<sizeof(int)<<endl;
    std::cout<<sizeof(int*)<<endl;
    return 0;
}

这是输出结果:

4
8

直到现在我还记得一个整数指针的大小是4个字节(GCC编译器)。我该如何检查指针的正确大小?这与计算机有关吗?

我正在运行Ubuntu 12.04。

# lsb_release -a

Distributor ID: Ubuntu 
Description: Ubuntu 12.04 LTS 
Release:    12.04 
Codename:   precise

指针的大小是否不是固定的(标准大小)8个字节。

7
64位操作系统? - gliderkite
2
@ahenderson- 你确定所有指针都保证是相同的大小吗? - templatetypedef
2
请注意,没有“标准尺寸”。 - user195488
2
@ahenderson:指向不同类型的指针不必具有相同的大小。 - Oliver Charlesworth
2
@ahenderson并不保证所有指针的大小相同。我曾经在一些机器上工作过,其中char*int*更大,并且在某些机器(Intel 8086)上函数指针和数据指针的大小也不同。 - James Kanze
显示剩余7条评论
4个回答

19

intint* 的大小完全取决于编译器和硬件。如果你看到一个 int* 使用了八个字节,那么你可能有64位硬件,这意味着每个指针占用八个字节。

希望这可以帮助你!


6
您可能拥有一个64位操作系统,但更重要的是,您的进程很可能是64位进程。 :-) - James McNellis
3
我想补充一下,唯一一个有标准定义大小的类型是 charsizeof(char) 的值始终为 1 - LihO
1
@LihO:char 的大小实际上没有被标准定义,但 sizeof 表达式的结果是 _字符数_。 - K-ballo
@K-ballo:我认为在C99之前是这样的,因为C99第6.5.3.4节说:“sizeof运算符产生其操作数的大小(以字节为单位)”。 - LihO
@Liho:除非他们修复了char中的位数_(永远不会发生)_...一个char是一个_byte_,但_byte_的大小是实现定义的。 - K-ballo

10

sizeof(char) == 1

除此之外没有其他保证(*).

在实际应用中,指针在16位系统上的大小为2,在32位系统上的大小为4,在64位系统上的大小为8。


(*) 参见James Kanze的评论。


2
保证 sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)。同样保证 sizeof(float) <= sizeof(double) <= sizeof(long double)。(还有一个保证是所有大小都是整数,但这更多或多少是理解的。) - James Kanze
@JamesKanze 想要严谨一些,好的评论。我试图根据问题类型和提问者尽可能清晰地写出答案。 - gliderkite
指针在8位系统上通常也是2个字节,例如Arduino Uno(ATmega 328微控制器)。 - Gabriel Staples

5

指针大小取决于系统、编译器和架构。在32位系统上,它通常是32位,而在64位系统上,它们通常是64位。

如果您想将指针存储到整数中,以便稍后再将其还原为指针,可以使用类型 intptr_t ,它是足够大的整型可容纳(我认为)普通(非函数)指针类型。


2
32位系统的“事实上”标准是ILP32——即,int、long和指针均为32位。对于64位系统,主要的Unix“事实上”标准是LP64——long和指针均为64位(但int为32位)。Windows 64位标准是LLP64——long long和指针为64位(但long和int都为32位)。曾经有一段时间,一些Unix系统使用了ILP64组织形式。这些“事实上”的标准都没有被C标准(ISO/IEC 9899:1999)所规定,但它们都是被允许的。
如果你关心可移植性,或者想要名称反映其大小,可以查看头文件,其中提供了以下宏:int8_t int16_t int32_t int64_tint8_t 保证为8位,int16_t 保证为16位,等等。
看这个问题

不能保证 int8_t 等类型存在。为了最大的可移植性,只需使用 int,除非您知道需要更大的类型,并验证输入。 - James Kanze
@JamesKanze: ??? <inttypes.h> 是相当标准的。http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/inttypes.h.html - user195488
@OAOD <stdint.h> 是标准的 C 和 C++ 头文件,其中定义了这些类型,在 <stdint.h> 中,int8_t 等被标记为可选。在 C 标准中,如果硬件支持它们,则认为它们是“必需的”;无论如何,这是意图。但它们必须是精确大小的类型,并且有符号类型必须是 2 的补码。在没有 8 位字节或不是 2 的补码的机器上,它们将不会被定义。(Posix 要求它们,这限制了可以实现它的硬件。) - James Kanze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接