c++ - 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
在这种情况下可能会简单地表现出未定义的行为。(此外,标准库通常由与编译器相同的人实现,因此可以自由地利用特定编译器的属性。)
解决方案
是的。来自第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
推荐阅读
- c# - 按时间(不是通过用户交互)自动从最小化模式将应用程序置于前台(在顶部最大化)
- pandas - 在 pandas 中,如何在具有匹配行和列的 3 个单独数据帧之间建立相关矩阵?
- microsoft-teams - MS Teams 传入连接器和图像
- html - 我想使用 joi 验证时间字段
- vtk - 如何加速 vtkCellPicker
- timestamp - nanopb 中的时间戳
- laravel - 如何用 laravel 解决 Apache2 ssl Cert 问题
- list - 根据条件从 Dart 中的对象列表中返回一个值
- kubernetes - 如何将所有 kubernetes 入口 yamls 转换为使用 API 版本networking.k8s.io/v1
- iis - 在 IIS 上发布时无法加载 Blazor webassembly 应用程序