根据 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 中也应该设置正确的警告级别。而且我也喜欢在第一次使用时声明(并可能立即初始化)。
您看到的效果可能是堆清零,并且先前的调用会将局部变量与先前的返回地址和其他垃圾混淆。保持 lint 质量。