减少指向数组第一个元素的指针是C17时未定义的行为。这个答案引用了C17的标准说法
C17 6.5.6/8 如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则计算值不会产生溢出;否则,行为将未定义。
这是最早定义的标准吗?这种操作是如何在早期的标准中定义的?以前是合法的吗?
发布于 2021-09-18 22:49:59
最早的C标准C89在3.3.6加法算子中也有相同的规则
当将具有整数类型的表达式添加到指针或从指针中减去时,积分值首先乘以所指向对象的大小。结果具有指针操作数的类型。如果指针操作数指向数组对象的一个成员,并且数组对象足够大,则结果指向同一个数组对象的一个成员,与原始成员适当地偏移。因此,如果P指向数组对象的成员,则表达式P+1指向数组对象的下一个成员。除非指针操作数和结果都指向同一个数组对象的一个成员,或者指向数组对象的最后一个成员,否则行为是未定义的。除非指针操作数和结果都指向同一个数组对象的成员,或者指针操作数指向数组对象的最后一个成员,并且结果指向同一个数组对象的一个成员,否则如果结果被用作单值*运算符的操作数,则行为是未定义的。
我不相信形成数组的"-1“元素的指针是定义得很好的C。当然,在特定的实现中,它可能发生了工作,或者被记录下来这样做了。
https://stackoverflow.com/questions/69238989
复制相似问题