【问题标题】:size of pointer is always equal to size of int in C compiler . Is it correct? [duplicate]在 C 编译器中,指针的大小始终等于 int 的大小。这是正确的吗? [复制]
【发布时间】:2016-04-29 10:15:16
【问题描述】:

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

【问题讨论】:

  • 你的前辈错了。
  • google 给出的答案比你的前辈更好;)
  • sizeof(int) 取决于你的编译器
  • 在这种情况下“高级”是什么意思?是老师还是同学?如果是老师,我们需要以某种方式确保停止这种危险的错误信息。
  • 不知道为什么这被否决了。 OP 是一个很好的人,可以质疑一个不称职的人教过他什么。

标签: c++ c linux ubuntu operating-system


【解决方案1】:

我的前辈告诉过,在 C 程序中,任何指针的大小总是等于 int 的大小。对吗?

不,这是不正确的

multiple different memory models possible,通常同时在同一个系统上。通常系统支持同时运行 ILP32 和 LP64 进程。 int 在 ILP32 和 LP64 中都是 4 字节(32 位),而在 LP64 中指针是 8 字节(64 位)。

【讨论】:

    【解决方案2】:

    不,不正确。

    你的“前辈”错了。您的编译器是正确的(显然)。

    int 的大小和指针的大小因平台而异,不一定相同。事实上,在现代 64 位消费类硬件上,您可能会发现 32 位 ints 和 64 位指针。

    【讨论】:

      【解决方案3】:

      不要求指针始终与int 大小相同。事实上,指向不同类型的指针不必彼此大小相同:

      Online C 2011 Standard

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

      对于 C++,请参阅 online C++ Standard,第 3.9.2 节,第 3 段。

      在 32 位机器上,指针类型和 int 大小相同是很常见的,但并非普遍适用(尤其是当我们转向 64 位架构时)。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 这不是答案,而是评论。
        • 这是一个很好的信息,都是一样的。
        猜你喜欢
        • 2013-11-11
        • 1970-01-01
        • 1970-01-01
        • 2017-06-01
        • 2011-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-02
        相关资源
        最近更新 更多