在这段代码中,为什么在我的测试中结果总是1
,2
和3
?
#include <stdio.h>
void test() {
int a;
a++;
printf("%d",a);
}
int main(int argc, char *argv[]) {
test();
test();
test();
}
我认为test()
中的变量是静态的,不是吗?为什么?
答案 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)
您尝试打印的变量不是静态的,也不是初始化的,因此它会占用垃圾值,这对您来说似乎是随机的,如果您在另一台机器上执行此程序,那么您将有不同的输出,因为那里你将有不同的垃圾值
为了避免它,你必须用一些值初始化你的变量