假设我有一个for循环,使用这样的指针将零存储在数组中:

int *vp, values[5];

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

关于C的Bookpoints指出,此循环存在问题,因为比较vp >= &values[0]在移出数组边界之外时未定义。但是如何?

最佳答案

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

为了可视化问题,让我们逐步进行操作,并假设values从地址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 - 在for循环中使用关系运算符测试指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16509687/

10-09 09:35