【问题标题】:Is it safe to assume that a pointer is the size of an int in C?假设指针是 C 中 int 的大小是否安全?
【发布时间】:2011-06-02 06:20:07
【问题描述】:

在设计一种新的编程语言时,假设 C int 和指针在机器上的大小相同是否安全?

【问题讨论】:

标签: c pointers language-design


【解决方案1】:

没有。指针的大小可能大于或小于整数。如果您出于某种原因需要将指针作为整数传递(例如执行整数,而不是指针、算术),则可以保证它们适合 intptr_t

不能保证它们符合另一个答案中建议的 size_t,但实际上它们不太可能不会,因为最大可寻址大小通常等于最大可寻址地址。

【讨论】:

    【解决方案2】:

    不,一点也不。许多编译器的大小不同。

    【讨论】:

      【解决方案3】:

      不,尤其是在 64 位环境中:

      LP64 这涵盖了 *nix 环境,但在 Windows 中同样适用于 LLP64。

      【讨论】:

        【解决方案4】:

        不,但是指针应该与 intptr_t 大小相同。

        【讨论】:

        • 看来 sizeof(int) != sizeof(int *) 与我目前正在使用的机器和编译器......所以如果类似的东西是安全的,它不涉及诠释。
        • @user9521:正如 Dan 所说,始终使用 size_t 类型。将代码转换为 x64 的主要问题是人们普遍认为 int 大小是相同的,这种做法在多年前已被弃用。
        • -1 - 事实上你可能是正确的,但在法律上你是错的。在分段(和其他类型的病态)内存架构上,size_t 可能小于 intptr_t。 stackoverflow.com/questions/1464174/size-t-vs-intptr-t.
        • 从技术上讲,即使在编辑之后,您的答案仍然是错误的。 intptr_t 可以安全地存储一个指针,这意味着它至少和它一样大。当 sizeof(int) == sizeof(void*) 时,通常也是 sizeof(intptr_t)。但我不认为有 sizeof(int)
        【解决方案5】:

        我认为您的意思是由平台而不是 C 语言定义的数据类型的大小。据我所知,C 没有为数据类型定义任何特定的大小。您的问题的答案是您不能假设这一点,例如在 win32 sizeof(int) == sizeof(pointer) == 4 bytes 但是在 win64 sizeof(int) == 4 和 sizeof(pointer) == 8

        【讨论】:

        • C 语言定义了几种最小数据大小(例如 size_t 必须至少为 16 位)、关系大小(long 不能短于 short),以及一些固定大小的类型(uint32_t正好是 32 位)。
        • @Joe 你是对的,我应该将我的答案限制为 int 和指针的相对大小。
        • @Joe:似乎 uint32_t 首次出现在 C99 的 C 标准中(参见 en.wikipedia.org/wiki/Stdint.h),因为那时 stdint.h 成为标准的一部分。 (我不知道实现有时是否会在 C99 之前提供它。)
        • @compman:以前,大多数实现通常会定义具有固定大小的整数类型;但是,由于这不是可移植的,许多项目都有自己定义这些的方法,通常使用 autoconf 将它们设置为正确的等价物,以获得适合当前编译器的大小。您可以编译并运行一个小型 C 程序来告诉您 sizeof(short)、sizeof(int) 等,然后使用结果编写一个头文件,其中包含 int16、int32 等的适当 typedef。
        【解决方案6】:

        没有;在我的 MacOS X 10.6.5 上。机器,int 默认为 32 位,指针默认为 64 位。

        如果您还需要一个大小合适的整数来保存指针,请使用#include <inttypes.h>(或<stdint.h>)和uintptr_t - 假设您支持C99,或者可以模拟它。

        【讨论】:

          【解决方案7】:

          我相信 Linux 内核将指针作为 unsigned long 传递。它们保证至少与指针大小相同:)

          【讨论】:

          • 没有。 Linux 保证它们的大小相同。 C 语言不做任何承诺。
          • 这实际上是一个很好的答案,因为它显示了一些内核行为,以及它们对 C 语言规则的无视。它会导致现实生活中的错误,例如 OpenSSL 的 Bug 4441: VIA C7-D processor: Hang in 30-test_afalg.t。这似乎是因为内核将指针(i686,32 位)转换为更大尺寸的整数(无符号长整数,然后存储在 __u64 中)。
          猜你喜欢
          • 2011-10-26
          • 2011-04-03
          • 2020-10-28
          • 2016-12-13
          • 2019-12-29
          • 2016-09-11
          • 1970-01-01
          • 2013-08-23
          相关资源
          最近更新 更多