我已完成搜索,但我发现与查询无关。 我目前正在调试C优化器,有问题的代码如下所示:
while( x-- )
array[x] = NULL;
在这种情况下会发生什么?并且这个逻辑的结果是否应该在所有编译器中保持一致?
让我们说在这种情况下x的初始值是5。
问题是程序崩溃,我的理解是它是由负数组元素引用引起的。
任何帮助都将不胜感激。
答案 0 :(得分:7)
此周期将以x
等于-1
(假设x
已签名)结束,但其正文将无法在最后一步生成array[-1]
。最后一次访问数组是array[0]
。所有实现中的行为都是一致的。
换句话说,您引用的代码中的负索引数组访问没有问题。但是,如果您在循环后立即尝试访问array[x]
,那么您确实可以访问array[-1]
。
您引用的代码是一个众所周知的实现模式的变体,当需要使用 unsigned 变量作为索引向后迭代数组时使用。例如
unsigned x;
int a[5];
for (x = 5; x-- > 0; )
a[x] = 0;
有些经验不足的程序员在向后迭代数组时使用无符号索引会遇到问题。 (由于无符号变量从不具有负值,因此x >= 0
的循环终止条件的初始实现不起作用。)这种方法 - 即循环终止条件中的后增量 - 在这种情况下有效。 (当然,它也适用于签名索引)。
答案 1 :(得分:2)
如果x
的初始值为5,则执行:
array[4] = NULL;
array[3] = NULL;
array[2] = NULL;
array[1] = NULL;
array[0] = NULL;
如果x
是签名类型,则x
的最终值为-1
;否则,它将是该类型的最大值。
答案 2 :(得分:0)
在处理x
循环(前提条件)之前,请确保while
为非负数。
当进程离开x
循环(post条件)时,while
值也将为-1。因此,在离开while
循环后,您不应使用array
作为索引来访问x
。