C语言中静态变量的初始化

C语言中静态变量的初始化,c,initialization,global-variables,static-variables,C,Initialization,Global Variables,Static Variables,可能重复: 我知道在C语言中,全局变量或静态变量都会自动初始化为零。但是,我不确定它们是都初始化了还是只有一个初始化了。 请注意,我不是在谈论函数中定义的变量,而是在.c文件中全局定义的变量 那么以下哪些变量会自动初始化为零 static struct mystruct var1; struct mystruct var2; static struct { int x; int y; } var3; .我在中运行了以下代码 无论如何,我不喜欢对初始化进行假设,但YMMV。更新了我的问题以澄清

可能重复:

我知道在C语言中,全局变量或静态变量都会自动初始化为零。但是,我不确定它们是都初始化了还是只有一个初始化了。 请注意,我不是在谈论函数中定义的变量,而是在.c文件中全局定义的变量

那么以下哪些变量会自动初始化为零

static struct mystruct var1;
struct mystruct var2;
static struct { int x; int y; } var3;

.

我在中运行了以下代码


无论如何,我不喜欢对初始化进行假设,但YMMV。

更新了我的问题以澄清它。Ty,这就是我要找的。全局变量将初始化为0。在Linux中,我猜大多数操作系统都会将这些变量分配到新映射的内存页中,这些内存页由内核设置为0。因此,对于全局变量,可以安全地假设它们总是初始化为0。(至少在Linux中)这里有一个假设危险的例子:一个标准说X不能阻止实现者做Y。关于协议实现,我始终牢记的一句话是:“对发送的内容严格,但对接受的内容宽容”。这也适用于变量初始化。如果可以的话,我会-1你的评论。假设语言在这些基本问题上的行为符合要求是没有危险的。我们是否也应该假设2+2可能不是4?你给出的链接似乎无关紧要。它作为wontfix关闭,没有解释发生了什么,但肯定不是未初始化静态变量的问题。更有可能是程序中的内存损坏错误,与gcc无关。顺便说一句,由于程序的最后一行使用了
x
,因此一致性实现可能会为前4行输出0以外的值。如果你的程序调用了未定义的行为,那么整个输出将被允许以实现者希望的任何方式偏离你在移除UB代码后的预期!如果您愿意,返回0。
struct mystruct { int a; };

static struct mystruct var1;
struct mystruct var2;
static struct { int x; int y; } var3;

#include <stdio.h>
void main()
{
    int x;
    printf("var1.a: %d\n", var1.a);
    printf("var2.a: %d\n", var2.a);
    printf("var3.x: %d\n", var3.x);
    printf("var3.y: %d\n", var3.y);
    printf("x: %d\n", x);
}
var1.a: 0
var2.a: 0
var3.x: 0
var3.y: 0
x: 1075105060