假设我有一个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/