为什么函数中的非静态变量被初始化为0,为什么它变为静态?

时间:2016-12-14 23:32:09

标签: c variables gcc static non-static

我正在尝试运行以下C代码

#include <stdio.h>

void myFunc() {
    static int a;
    int b;
    a++;
    b = b + 2;
    printf("a:%d, b:%d\n",a,b);
}

int main(void)  {
    myFunc();
    myFunc();
    return 0;
}

使用gcc版本5.4.0 20160609在ubuntu上编译时得到的结果是

a:1, b:2
a:2, b:4

我理解静态的 a 将初始化为零,但看起来非静态 b 也是零初始化。此外,看起来 b 实际上正在转换为静态变量,因为它的值会在第二次调用myFunc时保留。

我假设这与我的编译器/操作系统有关,因为在线编译(使用gcc 4.1.2)会给出

a:1, b:2
a:2, b:2

虽然由于某些原因仍然零初始化 b ,但在后续调用myFunc时不保留 b 的值。

1)为什么非静态变量被零初始化?我是否一直很幸运,编译器为其分配了一个零的内存块?

2)为什么gcc似乎将 b 转换为gcc 4中的静态变量而不是gcc 5?

编辑:

为了更好地说明这个问题,如果我再添加6次调用myFunc,结果输出为:

a:1, b:2
a:2, b:4
a:3, b:6
a:4, b:8
a:5, b:10
a:6, b:12
a:7, b:14
a:8, b:16

1 个答案:

答案 0 :(得分:3)

  1. 您的非静态变量b未初始化为零。在您的实验中,恰好b中的不确定垃圾值为零。零就像任何其他价值一样垃圾。

  2. 变量b未“转换为静态”。它不会在调用之间保留其值。在您的实验中,第二次函数调用中b的不确定垃圾值与第一次调用的最后一个值相同。该值与任何其他值一样垃圾。

  3. 虽然你观察到的“意外”行为有相当简单和确定性的潜在原因,但它却变得脆弱。这些都不会存在于现实代码中。