在我的系统上,ptrdiff_tsize_t均为 64位

我想澄清两件事:

  • 我相信由于地址空间的限制,没有数组可以和size_t一样大。这是真的?
  • 如果是,那么是否可以保证ptrdiff_t将能够保存max-size数组中的指针减去的结果?
  • 最佳答案

    大多数实现都是人为地限制最大数组大小,以确保指向同一数组的两个指针之间的差异适合ptrdiff_t。因此,在您的平台上,最大可能的数组大小很有可能约为SIZE_MAX / 2(尝试一下)。这不是“地址空间限制”,它只是实现内部执行的限制。在此限制下,合法指针减法(“legal” =将两个指针放入同一数组)不会溢出。

    语言规范不要求这样做。不需要以这种方式限制其数组大小的实现,这意味着语言规范允许看似合法的指针减法溢出并产生未定义的行为。但是大多数实现都倾向于通过限制其数组大小来对此进行防御。

    有关更多详细信息,请参见此处的“三个选项”:Why is the maximum size of an array "too large"?

    09-04 17:03