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

从C语言标准视角,指针移至数组末尾外后回退操作是否合法?

关于C语言数组指针越界后递减操作的合法性分析

先看你给出的代码:

void my_func(unsigned int *);

int main() {
  unsigned int a[8];
  // init_a(a); => a is properly initialized 
  my_func(a);

}

void my_func(unsigned int * a) {
    unsigned int * array_begin = a;

    a += 8; // HERE
    while (a-- > array_begin) {
        unsigned int tmp = *a;
        *a = (tmp >> 1);
         // other stuff
    }

}

你的理解方向是对的,这段代码的操作完全合法,不属于未定义行为,原因如下:

  • C标准明确允许指针指向数组末尾的下一个位置(也就是代码中a +=8后的指针位置),只要不对这个指针进行解引用操作就没问题。
  • 从这个“末尾下一个”的指针位置递减,回到数组的有效元素范围内的操作是合规的。代码中的循环逻辑里,a--会先完成比较再递减指针,第一次循环时,原本指向末尾下一个的指针会递减到数组最后一个元素的位置,此时解引用*a是完全合法的;后续循环中指针一直指向数组的有效元素,直到循环结束。

实际编译运行无异常、单元测试通过的结果也符合标准规定的行为。

内容的提问来源于stack exchange,提问作者R0m1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:52:18