6

我想知道为什么在以下程序中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 字节。

4

4 回答 4

18

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

希望这可以帮助!

于 2012-06-11T17:20:57.280 回答
8

sizeof(char) == 1

没有其他保证(*)。

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


(*) 见 James Kanze 的评论。

于 2012-06-11T17:22:32.940 回答
4

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

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

于 2012-06-11T17:21:25.780 回答
2

对于 32 位系统,“事实上的”标准是 ILP32——也就是说,int、long 和 pointer 都是 32 位的量。

对于 64 位系统,主要的 Unix 'de facto' 标准是 LP64 - long 和 pointer 是 64 位(但 int 是 32 位)。Windows 64 位标准是 LLP64 - long long 和 pointer 是 64 位(但 long 和 int 都是 32 位)。

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

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

如果您关心可移植性,或者您希望类型的名称反映大小,您可以查看 header ,其中可以使用以下宏:

int8_t int16_t int32_t int64_t

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

看到这个问题

于 2012-06-11T17:24:25.827 回答