从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
相关产品推荐
相关产品推荐

