考虑在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
作为输出。 但由于某些原因GCC 4.7没有做优化启用(编译时-O1
及更高版本)。 它而不是把随机数据在字符数组,成为第一字节:
| 0 | 1 | 2 | 3 | 4 |
| RANDOM | '3' | '\0' |
我认为这是从语言角度逻辑的行为:一个块结束后自动变量都消失了,所以上面的“随机”的行为应该可以预期的。
什么应该是正确的行为? 我知道,移动的声明x
外循环“修复”,但不说这个片段的行为,任何东西 。 在现实世界中的问题是在Netfilter的错误 。