我正在尝试运行以下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
答案 0 :(得分:3)
您的非静态变量b
未初始化为零。在您的实验中,恰好b
中的不确定垃圾值为零。零就像任何其他价值一样垃圾。
变量b
未“转换为静态”。它不会在调用之间保留其值。在您的实验中,第二次函数调用中b
的不确定垃圾值与第一次调用的最后一个值相同。该值与任何其他值一样垃圾。
虽然你观察到的“意外”行为有相当简单和确定性的潜在原因,但它却变得脆弱。这些都不会存在于现实代码中。