这个项目合法吗?如果是,请参考其中一个语言标准来支持您的索赔(无论哪种方式)。

void f(char *p) {
    char *q = p - 1;
    (void)( q < p );
};

int main(void) {
    char arr[] = "Hello";
    f( arr );
}

特别是,我感兴趣的是q < p比较是否合法。

最佳答案

不,不是这样的。使用不指向数组元素的指针或超过其结束的指针(即不在[&arr[0], &arr[size]]范围内的指针)调用未定义的行为。
C11标准,6.5.6.8(“加法运算符”):
如果指针操作数和结果[p+n]都指向同一数组对象的元素,或指向超过数组对象最后一个元素的元素,则计算不应产生溢出;否则,行为未定义。
(强调我的)

07-26 09:29
查看更多