在这段代码中,为什么在我的测试中结果总是1
,2
和3
?
#include <stdio.h>
void test() {
int a;
a++;
printf("%d",a);
}
int main(int argc, char *argv[]) {
test();
test();
test();
}
我认为变量test()
是静态的,不是吗?为什么?
在这段代码中,为什么在我的测试中结果总是1
,2
和3
?
#include <stdio.h>
void test() {
int a;
a++;
printf("%d",a);
}
int main(int argc, char *argv[]) {
test();
test();
test();
}
我认为变量test()
是静态的,不是吗?为什么?
变量不是静态的。您正在访问一个未初始化的变量。行为未定义。
正如其他答案所说,您的变量未初始化。它打印 1, 2 和 3 可能是因为您的编译器编译了代码,prolog(prologue)
用 zeros 清理了堆栈。
C中的局部变量,其实是指向你栈上的偏移量,stack frame
调用返回后会恢复。
我在谷歌上搜索并随机选择了一篇关于此的文章,请参阅[函数调用如何工作?]。
这是一个关于[汇编编程汇编函数堆栈框架解释]的视频讨论(再次,随机选择)。
维基百科也解释了[调用堆栈]。
因为您正在使用未初始化的值...(在这种情况下为随机行为)。
初始化您的变量(例如为 0):
#include <stdio.h>
void test(){
int a=0;
a++;
printf("%d",a);
}
int main(int argc, char *argv[]) {
test();
test();
test();
}
不,您的变量根本不是静态的!
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
}
您尝试打印的变量不是静态的,也不是初始化的,因此它采用垃圾值,这对您来说似乎是随机的,如果您在另一台机器上执行此程序,那么您将有不同的输出,因为您将有不同的垃圾值
为了避免它,你必须用一些值来初始化你的变量