You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

该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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 22:55:15