1

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

#include <stdio.h>

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

    printf("%d",a);
}

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

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

4

5 回答 5

9

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

于 2013-02-01T12:41:07.033 回答
3

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

C中的局部变量,其实是指向你栈上的偏移量,stack frame调用返回后会恢复。

我在谷歌上搜索并随机选择了一篇关于此的文章,请参阅[函数调用如何工作?]。

这是一个关于[汇编编程汇编函数堆栈框架解释]的视频讨论(再次,随机选择)。

维基百科也解释了[调用堆栈]。

于 2013-02-01T13:22:42.600 回答
2

因为您正在使用未初始化的值...(在这种情况下为随机行为)。

初始化您的变量(例如为 0):

#include <stdio.h>
void test(){
    int a=0;
    a++;
    printf("%d",a);
}
int main(int argc, char *argv[]) {
    test();
    test();
    test();
}
于 2013-02-01T12:41:10.047 回答
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
}
于 2013-02-01T12:43:43.983 回答
1

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

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

于 2013-02-01T12:43:56.277 回答