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

时间:2013-02-01 12:38:15

标签: c static local-variables

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

#include <stdio.h>

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

    printf("%d",a);
}

int main(int argc, char *argv[]) {
    test();
    test();
    test();
}

我认为test()中的变量是静态的,不是吗?为什么?

5 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:3)

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

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

我用谷歌搜索并随机选择了一个关于此的文章,见[How function calls work?]。

这是关于[Assembly Programming Assembly Function Stack Frame Explained ]的视频谈话(再次,随机选择)。

维基百科也解释了[Call stack]。

答案 2 :(得分:2)

因为您正在使用非正常值...(在这种情况下是随机行为)。

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

#include <stdio.h>
void test(){
    int a=0;
    a++;
    printf("%d",a);
}
int main(int argc, char *argv[]) {
    test();
    test();
    test();
}

答案 3 :(得分:2)

不,你的变量根本不是静态的!

https://stackoverflow.com/a/1597426/1758762

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

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
}

答案 4 :(得分:1)

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

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