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()
之前调用的任何函数的影响。