首页 > 解决方案 > C 或 C++ 是否保证数组 < 数组 + SIZE?

问题描述

假设你有一个数组:

int array[SIZE];

或者

int *array = new(int[SIZE]);

C 或 C++ 是否保证array < array + SIZE,如果有,在哪里?

我了解,无论语言规范如何,许多操作系统都通过为内核保留虚拟地址空间的顶部来保证此属性。我的问题是语言是否也保证这一点,而不仅仅是绝大多数实现。

例如,假设操作系统内核位于低内存中,并且有时将虚拟内存的最高页面分配给用户进程以响应mmap对匿名内存的请求。如果malloc::operator new[]直接要求mmap分配一个巨大的数组,并且数组的末尾紧靠虚拟地址空间的顶部,因此array + SIZE环绕为零,这是否等于该语言的不兼容实现?

澄清

请注意,问题不是询问array+(SIZE-1),它是数组最后一个元素的地址。保证大于array。问题是关于数组末尾的指针,或者p+1何时p是指向非数组对象的指针(所选答案指向的标准部分明确表示以相同的方式处理)。

Stackoverflow 要求我澄清为什么这个问题与这个问题不同。另一个问题询问如何实现指针的总排序。另一个问题本质上归结为库如何实现std::less,以便它甚至适用于指向不同分配对象的指针,标准说只能比较相等性,而不是大于和小于。

相比之下,我的问题是关于数组末尾的一个是否总是保证大于数组。我的问题的答案是是还是不是实际上并不会改变您std::less的实施方式,因此另一个问题似乎并不相关。如果与数组末尾之后的一个进行比较是非法的,那么std::less在这种情况下可能会简单地表现出未定义的行为。(此外,标准库通常由与编译器相同的人实现,因此可以自由地利用特定编译器的属性。)

标签: c++clanguage-lawyer

解决方案


是的。来自第6.5.8 节第 5 段

如果表达式 P 指向数组对象的一个​​元素,而表达式 Q 指向同一数组对象的最后一个元素,则指针表达式 Q+1 比较大于 P。

表达式array为 P。表达式array + SIZE - 1指向 的最后一个元素array,即 Q。因此:

array + SIZE = array + SIZE - 1 + 1 = Q + 1 > P = array


推荐阅读