【发布时间】:2013-08-11 14:18:06
【问题描述】:
从 SO 中的 this 帖子中可以看出,C 支持负索引。
-
为什么要在程序中支持这种潜在的内存冲突?
-
编译器不应该至少抛出一个负索引警告吗? (我正在使用 GCC)
-
或者这个计算是在运行时完成的?
编辑 1: 谁能暗示它的用途?
编辑 2: 用于 3。)在数组/指针的
[]中使用循环计数器表示索引的运行时计算。
【问题讨论】:
-
你可以合法地获取数组的第 N 个元素的地址,然后负索引到 -N。
-
@ 1) :为避免负索引,您可以使用无符号类型作为索引,它还具有 failing fast 的优点。
-
@wildplasser:不,他们不会更快地失败。在典型实现中,将
SIZE_MAX添加到指针(具有UB)与将-1添加到该指针具有相同的效果。 -
是的,他们确实失败得更快:负索引可能会默默地破坏内存,而
(unsigned) (~0)的索引将立即导致越界违规。跨度> -
如果
unsigned和size_t大小相同,则x[-1]和x[(unsigned) ~0]在常见实现中通常具有相同的效果。如果size_t比unsigned宽(这在“64 位”实现中并不少见),通常会有区别;前者通常在阵前,后者距离很远。但是,对于索引,通常应避免使用int或unsigned,而更喜欢ptrdiff_t。使用ptrdiff_t时,通常没有区别。