C 调用多个函数,函数的本地变量会被隐性“赋值”?

查看:86
本文介绍了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调用的时候,未赋值的局部变量复用了之前的内存值,因此出现了这种现象。
另外一方面,这种行为应该属于编译器未定义的行为,也许这个编译器是这样的,其他编译器就不会出现这样的行为了,即便是同一个编译器,也不能保证这种行为一定出现。因此还是不要干这样的事情。

这篇关于C 调用多个函数,函数的本地变量会被隐性“赋值”?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆