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 = 2

bar(): a = 1, b = 2

这里面 bar()a,b 变量没有初始化,照理输出难道不应该是乱码嘛?为什么和 foo() 的两个变量有一样的值?没有初始化,这两个值为什么会从另一个函数里跑过来???本地变量的作用范围不是只在函数中吗?


然后把 main()foo()bar() 调换下位置就看起来正常了,结果类似这样:

bar(): a = 0, b = 4195328

foo(): var1 = 1, var2 = 2

bar() 增加变量,另外增加的变量看起来也挺正常:

foo(): var1 = 1, var2 = 2

bar(): a = 1, b = 2, c = 26, d = 4195664

bar() 减少一个变量,a 看起来就好像是从 var1 赋值来的:

foo(): var1 = 1, var2 = 2

bar(): a = 1

回答:

局部变量是在栈上分配的,foo调用是变量入栈,这时内存被初始化了,foo返回时,只是栈底位置移动了,而内存的值并没被改变,导致bar调用的时候,未赋值的局部变量复用了之前的内存值,因此出现了这种现象。
另外一方面,这种行为应该属于编译器未定义的行为,也许这个编译器是这样的,其他编译器就不会出现这样的行为了,即便是同一个编译器,也不能保证这种行为一定出现。因此还是不要干这样的事情。

回答:

内存复用了。如果没有初始化,就是当前内存的值。

回答:

图片描述我调试了一下程序,发现a和b变量的内存地址和var1、var2是一样的。

以上是 C 调用多个函数,函数的本地变量会被隐性“赋值”? 的全部内容, 来源链接: utcz.com/p/194025.html

回到顶部