该shiftRmemmove函数行为是否有定义?size=1时情况如何?
size=1时shiftRmemmove函数的行为分析
先看待分析的函数代码:
int *shiftRmemmove(int *arr, size_t size) { if(arr && size) { memmove(arr + size - 1, arr + size - 2, (size - 1) *sizeof(*arr)); arr[0] = 0; } return arr; }
当size=1时,函数会进入if分支,此时等价于调用:
memmove(arr, arr - 1, 0);
关于行为是否有定义,要分两点明确:
- 首先,
memmove的第三个参数为0时,C标准明确规定该函数不会执行任何内存读写操作,这部分行为是有定义的。 - 但问题出在
arr - 1这个指针算术运算上:C标准要求,指针算术的结果必须指向数组的某个元素,或者数组末尾的下一个位置。如果arr指向数组的首元素,arr -1指向的是数组首元素之前的位置,完全超出了合法的指针范围,这个指针算术操作本身就属于未定义行为。
一旦代码中出现未定义行为,整个程序的行为就不再受标准约束——哪怕后续的memmove不会实际访问无效指针指向的内存,也无法改变整个函数行为未定义的事实。
内容的提问来源于stack exchange,提问作者gulpr
相关产品推荐
相关产品推荐

