我正在通过连续的内存块实现迭代器,并遇到了关于它的一致性使用的问题。我当前的实现(假设我正在遍历char
s 数组)。
typedef struct iterator{
void *next_ptr;
void *limit; //one past last element pointer
} iterator_t;
void *next(iterator_t *iterator_ptr){
void *limit = iterator_ptr -> limit;
void *next_ptr = iterator_ptr -> next_ptr;
ptrdiff_t diff = limit - next_ptr;
if(diff <= 0){
return NULL;
}
iterator_ptr -> next_ptr = ((char *) next_ptr) + 1;
return next_ptr;
}
问题是标准声称6.5.6(p9)
:
当两个指针相减时,它们都应指向同一个数组对象的元素,或者指向数组对象的最后一个元素
这是真实的。我假设我正在迭代的区域是一个数组。
如果结果在该类型的对象中不可表示,则行为未定义。换句话说,如果表达式分别指向数组对象的
i
第 -th 和-th 元素,则表达式具有值,前提是该值适合类型为 的对象。j
(P)-(Q)
i−j
ptrdiff_t
的限制ptrdiff_t
定义为7.20.3(p2)
:
的限制
ptrdiff_t
PTRDIFF_MIN
−65535
PTRDIFF_MAX
+65535
不能保证用 表示的所有值size_t
都应该用 表示ptrdiff_t
。
所以我们根据限制来判断,我们最多可以一致地减去一个数组的指针65535
吗?所以这在我想减去两个指向未知大小数组元素的指针的一般情况下不起作用?