【问题标题】:Pointer to one-before-first element of array is UB. When was this first defined so?指向数组第一个元素的指针是UB。这是什么时候第一次这样定义的?
【发布时间】:2021-11-13 06:00:52
【问题描述】:

自 C17 起,递减指向数组第一个元素的指针是未定义的行为。 This answer引用C17标准说法

C17 6.5.6/8

如果指针操作数和结果都指向同一个数组对象的元素,或者超过数组对象的最后一个元素,则计算不应产生溢出;否则,行为未定义。

这是最早定义的标准吗?早期标准中如何定义此类操作?以前合法吗?

【问题讨论】:

  • 你真的看过早期的标准吗?我不相信这曾经是合法的。当然,可能有特定的实现,无论是标准前还是标准后,它恰好可以工作或记录在案。
  • C89 中的措辞几乎相同:port70.net/%7Ensz/c/c89/c89-draft.html#3.3.6

标签: c language-lawyer pointer-arithmetic


【解决方案1】:

最早的 C 标准 C89 在3.3.6 Additive Operators 中具有相同的规则:

当一个整数类型的表达式被添加到指针或从指针中减去时,整数值首先乘以所指向对象的大小。结果具有指针操作数的类型。如果指针操作数指向数组对象的成员,并且数组对象足够大,则结果指向同一数组对象的成员,并与原始成员适当偏移。因此,如果 P 指向数组对象的成员,则表达式 P+1 指向数组对象的下一个成员。 除非指针操作数和结果都指向同一个数组对象的成员,或者超过数组对象的最后一个成员,否则行为是未定义的。 除非指针操作数和结果都指向指向同一个数组对象的成员,或者指针操作数指向数组对象的最后一个成员,结果指向同一个数组对象的成员,如果结果用作数组对象的操作数,则行为未定义一元 * 运算符。

我不相信形成指向数组的“-1”元素的指针曾经是明确定义的 C。当然,可能有特定的实现恰好可以工作,或者有文档证明可以这样做。

【讨论】:

    猜你喜欢
    • 2019-04-30
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多