【问题标题】:Why is it OK to compare one past the last element? [duplicate]为什么可以比较最后一个元素? [复制]
【发布时间】:2017-01-22 08:59:00
【问题描述】:

标准规定:

除非两个指针都指向同一个数组对象的元素或数组对象的最后一个元素,否则行为是未定义的。

为什么在最后一个元素之后引用一个是有效的?

【问题讨论】:

  • 因为标准规定它是有效的......
  • @EdgarRokyan;这就是他想要这样做的原因。
  • 您可能想澄清一下,唯一提到的是指针的计算。没有实际的对象驻留在该位置是法律允许的参考。

标签: c++ c pointers memory


【解决方案1】:

计算该指针并仅与它进行比较是可以的。原因是它可以使用一对指针来传递和迭代数组。

如果标准不允许,那么仅仅存在pend 就会显示出未定义的行为

int arr[100] = {0};

for (int *pbegin = arr, *pend = arr + 100; pbegin != pend; ++pbegin)
{
  // do stuff
}

这在 C++ 中尤为重要,标准库大量使用将范围作为“迭代器到开头和结尾的迭代器”的习惯用法。

【讨论】:

  • 好的,这就是我的预期。但是,为什么它未定义为... *pendAndOne = arr + 101; pbegin != (pendAndOne - 1); ...
  • @wulfgarpro - 因为这是标准委员会的决定。对他们来说,为了方便一个有用的习语而做出一个例外似乎是合理的。将其他所有内容保留为未定义行为允许不同的实现支持截然不同的环境。
  • @wulfgarpro 如果... *pendAndOne = arr + 101; 被允许,那么... *pendAndOne = arr + 102; 呢? ...
  • @songyuanyao arr + 101 是未定义的行为。
  • @wulfgarpro One-past-the-end 指针很有用,并且在编写标准时已经在所有现有实现上工作。当您超过一个时,这不是很有用,并且在某些实现中它会中断(尽管您可能需要在结束后超过两个)或以标准无法描述的方式表现(例如再次指向arr),因此没有必要对其进行标准化。
猜你喜欢
  • 1970-01-01
  • 2019-08-03
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2017-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多