void func();
int main() {
func();
func();
func();
}
void func() {
int a;
printf("%d\n",++a);
}
当我在GCC编译器中运行此C代码时,输出为
1
2
3
为什么不使用static
关键字就发生这种情况?
有两种情况要考虑:
static
,则将其初始化为零;指针类型的static
变量设置为NULL
根据C标准(6.7.9初始化)
10如果具有自动存储持续时间的对象未初始化明确地,其值为indeterminate。
和(3.19.2)
1不确定值,不确定值或陷阱表示
因此,具有自动存储持续时间的对象没有默认值。它们具有不确定的值。
请注意,局部变量和具有自动存储持续时间的变量的概念是不同的。例如在此程序中
#include <stdio.h>
int x = 10;
void f()
{
extern int x;
printf( "%d\n", x );
}
int main( void )
{
f();
}
在函数f中声明的变量x,如
extern int x;
是函数的局部变量。但是它具有外部链接,并且表示与全局变量相同的变量。 X。
程序输出将是
10
这是一个非常简单的程序。局部变量放在堆栈上。没有人可以保证程序开始时堆栈上会包含什么值。但是,由于您调用了递增局部变量a
的相同函数,因此该变量在堆栈上递增。然后,再次调用相同的函数,以便它在堆栈上分配相同位置,该位置自上次以来已具有a
的值。如果在func ()
中的int main()
之间调用任何其他函数(例如printf
),则会得到不同的结果。