C 为什么未初始化的局部变量总是具有相同的初始值?

C 为什么未初始化的局部变量总是具有相同的初始值?,c,static,local-variables,C,Static,Local Variables,在这段代码中,为什么我的测试结果总是1、2和3 #include <stdio.h> void test() { int a; a++; printf("%d",a); } int main(int argc, char *argv[]) { test(); test(); test(); } #包括 无效测试(){ INTA; a++; printf(“%d”,a); } int main(int argc,char*argv

在这段代码中,为什么我的测试结果总是
1
2
3

#include <stdio.h>

void test() {
    int a;
    a++;

    printf("%d",a);
}

int main(int argc, char *argv[]) {
    test();
    test();
    test();
}
#包括
无效测试(){
INTA;
a++;
printf(“%d”,a);
}
int main(int argc,char*argv[]){
test();
test();
test();
}

我认为
test()
中的变量是静态的,不是吗?为什么?这个变量不是静态的。您正在访问未初始化的变量。行为未定义。

变量不是静态的。您正在访问未初始化的变量。行为未定义。

因为您正在使用未初始化的值。。。(本例中为随机行为)

初始化变量(示例为0):

#包括
无效测试(){
int a=0;
a++;
printf(“%d”,a);
}
int main(int argc,char*argv[]){
test();
test();
test();
}

因为您正在使用未初始化的值。。。(本例中为随机行为)

初始化变量(示例为0):

#包括
无效测试(){
int a=0;
a++;
printf(“%d”,a);
}
int main(int argc,char*argv[]){
test();
test();
test();
}

不,您的变量根本不是静态的

静态变量(文件范围和函数静态)初始化为零:

int x; // zero
int y = 0; // also zero

    void foo() {
        static int x; // also zero
    }
非静态变量(局部变量)是不确定的。在赋值之前读取它们会导致未定义的行为

void foo() {
    int x;
    printf("%d", x); // the compiler is free to crash here
}

不,您的变量根本不是静态的

静态变量(文件范围和函数静态)初始化为零:

int x; // zero
int y = 0; // also zero

    void foo() {
        static int x; // also zero
    }
非静态变量(局部变量)是不确定的。在赋值之前读取它们会导致未定义的行为

void foo() {
    int x;
    printf("%d", x); // the compiler is free to crash here
}

您试图打印的变量不是静态的,也不是初始化的,因此它接受垃圾值,这对您来说似乎是随机的,如果您在不同的机器上执行此程序,那么您将有不同的输出,因为在那里您将有不同的垃圾值


为了避免它,您必须用一些值初始化变量

您试图打印的变量不是静态的,也不是初始化的,因此如果您在不同的机器上执行此程序,它会接受垃圾值,这在您看来是随机的,然后,您将有不同的输出,因为在那里您将有不同的垃圾值


为了避免它,您必须使用一些值初始化变量

,正如其他答案所述,您的变量未初始化。 它打印1、2和3,这可能是因为编译器使用
prolog(prologue)
编译代码,并用零清理堆栈

C中的局部变量实际上指向堆栈上的偏移量,
堆栈帧将在调用返回后恢复

我在谷歌上搜索并随机选择了一篇文章,讲述了这一点,见[]

这是一段关于[]的视频(同样是随机选择的)


维基百科也解释了[]

如其他答案所述,您的变量未初始化。 它打印1、2和3,这可能是因为编译器使用
prolog(prologue)
编译代码,并用零清理堆栈

C中的局部变量实际上指向堆栈上的偏移量,
堆栈帧将在调用返回后恢复

我在谷歌上搜索并随机选择了一篇文章,讲述了这一点,见[]

这是一段关于[]的视频(同样是随机选择的)


维基百科也解释了[]

垃圾值是否取决于机器?垃圾值是未引用的值,仍在内存中,但已失去引用,因此编译器从任何内存位置拾取,对于我们来说,垃圾值是什么?垃圾值取决于机器吗?垃圾值是指未引用的值,它们仍在内存中,但已失去引用,因此编译器从任何内存位置拾取,对于我们来说,这是垃圾值。这相当复杂!可能是:5,8,7。这是不确定的!您的变量“a”可以是:0,之前的值(可能是您的情况),甚至可以使程序崩溃!您必须始终初始化变量。您可能收到了警告,不是吗?@Leo.Dong,您之所以看到1、2、3,是因为
test
的堆栈框架恰好与以前完全相同,从而有效地使
a
使用其先前的值。这是完全未定义的行为,不可依赖。您可以尝试在
test()
调用之间插入两个函数调用(例如
printf
),并查看
a
的未初始化值实际上受到
test()
之前调用的任何函数的影响。这相当复杂!可能是:5,8,7。这是不确定的!您的变量“a”可以是:0,之前的值(可能是您的情况),甚至可以使程序崩溃!您必须始终初始化变量。您可能收到了警告,不是吗?@Leo.Dong,您之所以看到1、2、3,是因为
test
的堆栈框架恰好与以前完全相同,从而有效地使
a
使用其先前的值。这是完全未定义的行为,不可依赖。您可以尝试在
test()
调用之间插入两个函数调用(例如
printf
),并查看
a
的未初始化值实际上受到
test()
之前调用的任何函数的影响。