Ilg*_*fin 0 c pointer-arithmetic language-lawyer
从 C17 开始,递减指向数组第一个元素的指针是未定义的行为。这个答案引用了C17标准的说法
C17 6.5.6/8
如果指针操作数和结果都指向同一个数组对象的元素,或者超过数组对象的最后一个元素,则求值不会产生溢出;否则,行为是未定义的。
这是最早定义的标准吗?早期标准中如何定义此类操作?以前合法吗?
最早的 C 标准 C89 在3.3.6 Additive Operators中有相同的规则:
当将具有整型类型的表达式添加到指针或从指针中减去时,首先将整型值乘以所指向对象的大小。结果具有指针操作数的类型。如果指针操作数指向数组对象的成员,并且该数组对象足够大,则结果指向同一数组对象的成员,与原始成员适当偏移。因此,如果 P 指向数组对象的成员,则表达式 P+1 指向数组对象的下一个成员。除非指针操作数和结果都指向同一数组对象的成员,或者指向数组对象的最后一个成员,否则行为是未定义的。除非指针操作数和结果都指向同一个数组对象的成员,或者指针操作数指向数组对象的最后一个成员,而结果指向同一个数组对象的成员,否则行为未定义,如果结果用作一元 * 运算符的操作数。
我不认为形成指向数组的“-1”元素的指针是明确定义的 C 语言。当然,可能有特定的实现,它恰好可以工作,或者被记录为这样做。
| 归档时间: |
|
| 查看次数: |
105 次 |
| 最近记录: |