【问题标题】:must sizeof(void*) >= sizeof(size_t)? [duplicate]必须 sizeof(void*) >= sizeof(size_t) 吗? [复制]
【发布时间】:2021-12-06 00:36:45
【问题描述】:

这里有一个关于 sizeof(size_t)sizeof(void*) 相等性的问题,接受的答案是它们不能保证相等。

但至少,必须是这样:

sizeof(void*) >= sizeof(size_t)

我想是的。因为,在给定的 C 实现中取最大的存储对象,大小为S。现在,可以将存储区域视为大小为S 的字节数组。因此,必须有一个指向每个字节的指针,并且所有这些指针都是可比的和不同的。因此,void* 类型的不同元素的数量必须至少是size_t 类型的最大数量,它是无符号整数类型。因此sizeof(void*) >= sizeof(size_t)

我的推理是否合理?

【问题讨论】:

  • 密切相关size_t vs. uintptr_t
  • 我没有看到标准中的任何内容阻止了 48 位指针和 64 位 size_t
  • 您的逻辑假设size_t正好 足够的位来表示最大可能的大小。它可以有更多。
  • @user2357112 支持莫妮卡哦,我明白了,谢谢,请回复我会接受的

标签: c language-lawyer


【解决方案1】:

我的推理是否合理?

您重新推理的问题是您假设最大对象的大小可能等于 SIZE_MAX。但事实并非如此。如果你这样做了

void* p = malloc(SIZE_MAX);

您将(很可能)返回一个 NULL 指针。

您可能还会收到如下警告:

main.cpp:48:15: warning: argument 1 value '18446744073709551615' exceeds maximum object size 9223372036854775807 [-Walloc-size-larger-than=]
   48 |     void* p = malloc(SIZE_MAX);
      |               ^~~~~~~~~~~~~~~~

由于最大对象大小不是(总是)SIZE_MAX,因此您不能使用 SIZE_MAX 的值来争论指针的大小。

顺便说一句:某些在软件级别使用 64 位指针的 CPU 实现在硬件级别可能没有 64 位。相反,有些位只是被视为全一/全零。

【讨论】:

    猜你喜欢
    • 2013-09-19
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多