局部变量自动初始化

问题描述 投票:0回答:1

根据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

c definition local-variables
1个回答
0
投票

正确地包含未确定的值。

与java中的语言设计相比:对象字段被清零(或null或false),局部变量也未初始化。 当某些变量可能未初始化时,编译器会给出一条消息。

这是故意的。因此,当程序员忘记设置值时,他们不会错误地使用默认值。

现在在 C 中也应该设置正确的警告级别。我也喜欢首次使用时的声明(可能还有立即初始化)。

您看到的效果可能是堆归零,并且先前的调用将局部变量与先前的返回地址和其他垃圾搞乱。保持绒毛质量。

© www.soinside.com 2019 - 2024. All rights reserved.