考虑 C 中的一个循环,它在循环体中声明了一个字符数组。在每次迭代中,数组的一个字符都会被修改,直到到达末尾。最后,打印变量。描述将扩展到下一个代码:
#include <stdio.h>
int main(void) {
int i = 0;
for (;;) {/* same as: while(1) { */
char x[5];
x[i] = '0' + i;
if (++i == 4) {
x[i] = '\0'; /* terminate string with null byte */
printf("%s\n", x);
break;
}
}
return 0;
许多人可能期望0123
作为输出。-O1
但是由于某种原因,GCC 4.7 在启用优化(和更高版本)的情况下不会这样做。而是将随机数据放在字符数组的第一个字节中,变为:
| 0 | 1 | 2 | 3 | 4 |
| RANDOM | '3' | '\0' |
我认为从语言的角度来看这是合乎逻辑的行为:块终止后自动变量消失了,因此应该预料到上述“随机”行为。
正确的行为应该是什么?我知道将声明移到x
循环之外“修复”它,但这并没有说明这个片段的行为。现实世界的问题是Netfilter 中的一个错误。