C 调用多个函数,函数的本地变量会被隐性“赋值”?
有次忘了初始化变量,突然发现这么个状况。开始还以为是偶然事件,结果多试验了几次屡试不爽,而且不论用 clang 还是 gcc 都一样。疑惑函数之间为什么会出现这种类似本地变量被“赋值”的状况。举个简单的例子:
#include<stdio.h>void foo(void);
void bar(void);
void main(void)
{
foo();
bar();
}
void foo(void)
{
int var1 = 1, var2 = 2;
printf("foo(): var1 = %d, var2 = %d\n", var1, var2);
}
void bar(void)
{
int a, b;
printf("bar(): a = %d, b = %d\n", a, b);
}
编译通过,运行得到结果
foo(): var1 = 1, var2 = 2bar(): a = 1, b = 2
这里面 bar()
的 a
,b
变量没有初始化,照理输出难道不应该是乱码嘛?为什么和 foo()
的两个变量有一样的值?没有初始化,这两个值为什么会从另一个函数里跑过来???本地变量的作用范围不是只在函数中吗?
然后把 main()
的 foo()
bar()
调换下位置就看起来正常了,结果类似这样:
bar(): a = 0, b = 4195328foo(): var1 = 1, var2 = 2
给 bar()
增加变量,另外增加的变量看起来也挺正常:
foo(): var1 = 1, var2 = 2bar(): a = 1, b = 2, c = 26, d = 4195664
bar()
减少一个变量,a
看起来就好像是从 var1
赋值来的:
foo(): var1 = 1, var2 = 2bar(): a = 1
回答:
局部变量是在栈上分配的,foo
调用是变量入栈,这时内存被初始化了,foo
返回时,只是栈底位置移动了,而内存的值并没被改变,导致bar
调用的时候,未赋值的局部变量复用了之前的内存值,因此出现了这种现象。
另外一方面,这种行为应该属于编译器未定义的行为,也许这个编译器是这样的,其他编译器就不会出现这样的行为了,即便是同一个编译器,也不能保证这种行为一定出现。因此还是不要干这样的事情。
回答:
内存复用了。如果没有初始化,就是当前内存的值。
回答:
我调试了一下程序,发现a和b变量的内存地址和var1、var2是一样的。
以上是 C 调用多个函数,函数的本地变量会被隐性“赋值”? 的全部内容, 来源链接: utcz.com/p/194025.html