c – 在for循环中使用关系运算符测试指针

前端之家收集整理的这篇文章主要介绍了c – 在for循环中使用关系运算符测试指针前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我有一个for循环,它使用如下指针在数组中存储零:
int *vp,values[5];

for(vp = &values[5-1]; vp >= &values[0]; vp--)
   *vp = 0;

C上的指针表示该循环存在问题,因为比较vp> =& values [0]未定义,因为它移出了数组的边界.但是怎么样?

解决方法

假设一个指针等价于一个无符号整数,我们可以看到,只有当值从地址0开始时,问题才会存在,在这种情况下,指针会在递减后变为UINT_MAX.

为了使问题可视化,让我们逐步完成所发生的事情,假设值从地址0x0开始:

iteration 1: 
vp = 0x4,*vp = 0;

iteration 2:
vp = 0x3,*vp = 0;

iteration 3: 
vp = 0x2,*vp = 0;

iteration 4:
vp = 0x1,*vp = 0;

iteration 5:
vp = 0x0,*vp = 0;

iteration 6:
vp = 0xFFFFFFFF; *vp = ?? // uh oh!

因此,vp永远不会小于指针的最小值(为0),并且它将导致无限循环(假设所有内存都是可写的)或分段错误.

根据标准,它也是未定义的行为(因为你可以在数组之后但不能在数组之前解决一个元素),但实际上,在任何实际系统中都不应该失败.

猜你在找的C&C++相关文章