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

Why is sizeof(int) different than sizeof(int*)?

本文关键字:int sizeof 不同 为什么      更新时间:2023-10-16

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

这是小程序:

int main(){
    std::cout<<sizeof(int)<<endl;
    std::cout<<sizeof(int*)<<endl;
    return 0;
}

这是输出:

4
8

到目前为止,我记得整数指针的大小是 4byte(gcc 编译器)。如何检查指针的正确大小?它是否依赖于计算机?

我正在运行 ubuntu 12.04

# lsb_release -a
Distributor ID: Ubuntu 
Description: Ubuntu 12.04 LTS 
Release:    12.04 
Codename:   precise

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

intint*的大小完全取决于编译器和硬件。 如果您看到 int* 中使用了 8 个字节,则您可能拥有 64 位硬件,相当于每个指针 8 个字节。

希望这有帮助!

sizeof(char) == 1

没有其他保证(*)。

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


(*)请参阅詹姆斯·坎泽的评论。

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

如果您尝试将指针存储到整数中以便以后再次恢复到指针中,则可以使用类型 intptr_t,这是一个足够大的整数类型,可以容纳(我相信)普通(非函数)指针类型。

对于 32 位系统,"事实上"的标准是 ILP32 - 即 int, Long 和指针都是 32 位数量。

对于 64 位系统,主要的 Unix"事实上"标准是 LP64 - long 和指针是 64 位(但 int 是 32 位)。视窗 64 位 标准是 LLP64 - 长长和指针是 64 位(但长和整数 均为 32 位)。

曾经,一些Unix系统使用ILP64组织。

这些事实上的标准都没有由C标准立法。 (ISO/IEC 9899:1999),但所有这些都是它允许的。

如果您关心可移植性,或者您想要 类型反映大小,可以查看标题,其中 以下宏可用:

int8_t int16_t int32_t int64_t

int8_t保证为 8 位,int16_t保证为 16 位 位等。

看到这个问题。