根据C标准,在局部作用域中声明的局部变量将携带垃圾值,直到它们被显式初始化。与此相反,如果变量是在全局作用域中声明的,则它会隐式定义为 0。
仅当我声明一两个变量(例如
int w, x
)时,所有这些才成立。但是当我声明三个或更多变量时,很少有变量被自动定义为 0。我相信这完全违反标准。
注意:我运行了多次,它每次都这样做,就好像它是故意的一样。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int w, x, y, z;
printf("%d %d %d %d\n", w, x, y, z);
return EXIT_SUCCESS;
}
GCC 的输出:
0 0 1623616696 32764
Clang 的输出:
849564872 0 0 29759
正确地包含未确定的值。
与java中的语言设计相比:对象字段被清零(或null或false),局部变量也未初始化。 当某些变量可能未初始化时,编译器会给出一条消息。
这是故意的。因此,当程序员忘记设置值时,他们不会错误地使用默认值。
现在在 C 中也应该设置正确的警告级别。我也喜欢首次使用时的声明(可能还有立即初始化)。
您看到的效果可能是堆归零,并且先前的调用将局部变量与先前的返回地址和其他垃圾搞乱。保持绒毛质量。