4

我进行了搜索,但没有发现与我的查询相关的内容。我目前正在调试一个 C 优化器,有问题的代码如下所示:

while( x-- )
array[x] = NULL;

在这种情况下应该发生什么?这个逻辑的结果是否应该在所有编译器中保持一致?

假设在这种情况下 x 的初始值为 5。

问题是程序崩溃了,我的理解是是负数组元素引用引起的。

任何帮助,将不胜感激。

4

3 回答 3

7

此循环将以x等于-1(假设x已签名)结束,但其主体不会array[-1]在最后一步产生访问权限。最后一个数组访问是array[0]. 该行为在所有实现中都是一致的。

换句话说,您引用的代码中的负索引数组访问没有问题。但是,如果您尝试array[x]在循环后立即访问,那么您确实会访问array[-1].

您引用的代码是一种相当知名的实现模式的变体,当需要使用无符号变量作为索引对数组进行向后迭代时使用。例如

unsigned x;
int a[5];

for (x = 5; x-- > 0; )
  a[x] = 0;

有时,经验不足的程序员在向后迭代数组时会遇到使用无符号索引的问题。(由于无符号变量永远不会有负值,循环终止条件的幼稚实现x >= 0不起作用。)这种方法 - 即循环终止条件中的后增量 - 在这种情况下是有效的。(当然,它也适用于有符号索引)。

于 2011-03-21T05:19:16.273 回答
2

如果 的初始值为x5,它将执行:

array[4] = NULL;
array[3] = NULL;
array[2] = NULL;
array[1] = NULL;
array[0] = NULL;

如果是有符号类型,则 的最终x值为; 否则,它将是该类型的最大值。x-1

于 2011-03-21T05:32:49.583 回答
0

在处理循环(前提条件)之前确保x它是非负数。当进程离开循环(后置条件)时,值while也将为-1。因此,离开循环后,您不应该访问using as index。xwhilewhilearrayx

于 2011-03-21T05:28:05.460 回答