【发布时间】:2020-07-23 12:51:42
【问题描述】:
在 Jens Gustedt 的教科书“Modern C”中,我读到了“指针必须指向有效对象或超出有效对象的一个位置或为空。”的指针。为什么指向有效对象之外的一个位置是可以接受的?例如:
int array[5] = {0};
int* p = array;
p = array + 5 // points to a valid location
p = array + 6 // points to an invalid location
【问题讨论】:
-
请引用教科书。我想读一读。
-
p = array + 5 // points to a valid location-- 不,它没有! -
当迭代一个数组并后递增一个指针时,它允许最后一个元素被视为与其他元素相同,而无需对其进行特殊处理。指向一个超越,并不意味着它可以被取消引用。
-
@RobertSsupportsMonicaCellio:您指向的评论并没有这么说。该注释是在
p_a指向结构成员而不是数组的上下文中,因此未定义p_a+4。这与数组中的指针运算和最后一个元素之外的位置无关。 -
是的,@RobertSsupportsMonicaCellio。因此,对于任何左值
x,都可以评估&x + 1,存储结果,并以多种方式使用它。这算作指向数组末尾后一个元素的指针。但对于许多——虽然不是全部——左值,计算&x + 2、&x + 3、等。有未定义的行为,你和 M.M.正在讨论其中一个案例。