该函数的行为是否已定义?

gul*_*lpr 1 c language-lawyer

int *shiftRmemmove(int *arr, size_t size)\n{\n    if(arr && size)\n    {\n        memmove(arr + size - 1, arr + size - 2, (size - 1) *sizeof(*arr));\n        arr[0] = 0;\n    }\n    return arr;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

是否定义为size == 1它正在计算并传递对第一个元素之前的数组元素的引用。它相当于:memove(arr, arr -1, 0); (\xc2\xa9Jabberwocky)

\n

ex *_*ilo 6

如果arr是指向数组第一个元素的指针,并且如果size是 1,则即使尝试形成地址arr + size - 2也是未定义的行为。C 标准(C23 标准草案 6.5.6 9)对此进行了详细说明:

当将具有整数类型的表达式添加到指针或从指针中减去时,...如果指针操作数和结果不指向同一数组对象的元素或超出数组对象的最后一个元素,则行为未定义。