标题: 子函数定义的局部变量问题求助 [打印本页]

作者: cjjdemon    时间: 2022-8-27 14:41
标题: 子函数定义的局部变量问题求助
各位高手,请求局部变量的问题,帮忙看一下以下程序
char f1(char x)
{
   char y;
   y=一顿计算; (计算过程还有可能再调用其它子函数)
   return y
}

void f2()
{
    char a;
    char b;
    a=1;
    b=f1(x);
}

想问,a得到的数值,会不会因为调用了f1函数之后,变成其它值了?
我用实际程序试过,a偶发性的变成非1的值,找不到原因。


作者: haiyang201    时间: 2022-8-27 15:47
一般不会变  
作者: 624353765    时间: 2022-8-27 15:57
局部变量会改变的
作者: gd2051    时间: 2022-8-27 17:04
一般不会;这个问题很有可能与编译器优化等级有一点关系。
作者: littlespider    时间: 2022-8-27 18:12
有可能,这要看调用的函数是什么,一般都是指针未正确初始化造成的。例如函数里有下面类似的语句

char* p;
*p = 0; //指针还未初始化就使用,如果此时指针恰巧指向a的地址,a值就会被修改
作者: xuyaqi    时间: 2022-8-27 18:18
你 a 定义为局部变量,只在 f2() 内保持不变,出了f2() 就会变,应该定义为全局变量。
作者: 188610329    时间: 2022-8-27 18:46
void f2()
{
    char a;
    char b;
    a=1;
    b=f1(x);
}

a是临时变量, 当运行完 b=f1(x) 之后, a 是不会再用到了, 所以,这个时候 a 就被抛弃了。如果:
void f2()
{
    char a;
    char b;
    a=1;
    b=f1(x);
    a++;
}
那么, 运行   b=f1(x); 时, 才会把 a 保护起来。

作者: 飞云居士    时间: 2022-8-27 22:12
语法上没问题,可能是RAM溢出(RAM不够用了,一通计算占用太多RAM)。
作者: wpppmlah    时间: 2022-8-27 23:55
局部变量a 的生命周期,被局限在子函数f2()中,当执行完f2()中最后一行语句b=f1(x);后它的生命就完结了,至于会变成什么值,那也就听天由命了。这是我的理解,不知道对不对。还请大家指正
作者: Hephaestus    时间: 2022-8-28 07:59
新手的通病,一旦找不到问题所在就会怀疑编译器。
作者: coody_sz    时间: 2022-8-28 09:27
原则上,调用函数不会改变本函数的局部变量,但是楼主的例子中,局部变量给了一个值,后面却没有使用,则编译以可能会优化掉,因为编译器觉得给局部变量一个值但又不使用,指令就没有意义,优化掉。
作者: frank_tw    时间: 2022-8-28 10:10
可能是堆叠空間不足
作者: 奋斗的小白熊    时间: 2022-8-28 11:48
个人理解是有可能会变,虽然a是f2中的局部变量,离开f2函数后,如果调用的其他函数中有指针指向了a的地址,也有可能会变。
作者: Hephaestus    时间: 2022-8-28 14:32
奋斗的小白熊 发表于 2022-8-28 11:48
个人理解是有可能会变,虽然a是f2中的局部变量,离开f2函数后,如果调用的其他函数中有指针指向了a的地址, ...

是f2()调用的f1(),执行f1()的时候绝对不是“离开了”f2(),你的理解完全错误。
作者: xxxevery    时间: 2022-8-28 18:29
从程序上看a就是一个赋值为1的局部变量,跟其他没啥关系,楼主说a偶尔会变是在什么时候输出的,在f2()函数内输出的话一般是不可能的,除非编译上有警告你没注意;如果是在f2()函数外输出的话那确实会出错,因为a出了函数f2后就会被系统销毁,这时你在原变量的地址取值会得到一个随机值
作者: Hephaestus    时间: 2022-8-28 22:48
xxxevery 发表于 2022-8-28 18:29
从程序上看a就是一个赋值为1的局部变量,跟其他没啥关系,楼主说a偶尔会变是在什么时候输出的,在f2()函 ...

你的理解也是错误的。在f2()函数以外输出的时候,a根本就不存在,你怎么在f2()以外输出a的,写一句代码让我也乐一乐。当然按我在14楼的说法,f2()调用f1(),在f1()内输出不属于f2()以外。
作者: cjjdemon    时间: 2022-8-29 17:20
反正我 现在只能把a定义为全局变量才能保证a的值稳定不变。f2()下面还有其它语句的,不是把a赋1后就不用了。所以这个局部变量有时候真的搞不明白。
作者: xxxevery    时间: 2022-8-29 20:37
Hephaestus 发表于 2022-8-28 22:48
你的理解也是错误的。在f2()函数以外输出的时候,a根本就不存在,你怎么在f2()以外输出a的,写一句代码让 ...

我的意思是楼主在什么时候用什么办法看到a是非1的值的,是用串口输出的还是软件仿真的等等,这点很重要,很多时候看到的并不一定是真实的。初学者写出非法调用局部变量的值的语句经常都会发生,编译器也不是每次都报错。
作者: Hephaestus    时间: 2022-8-29 23:02
cjjdemon 发表于 2022-8-29 17:20
反正我 现在只能把a定义为全局变量才能保证a的值稳定不变。f2()下面还有其它语句的,不是把a赋1后就不用了 ...

其实你的问题并没有解决,如果确实如你所述,a作为局部变量被意外更改的话,那么原因基本可以肯定是数组访问越界造成的,你改成全局变量,a的存储位置发生了变化,不会被意外改变,但是会有一个你想象不到的变量被意外改变,然后……就是很难解决的bug。
作者: xxxevery    时间: 2022-8-30 14:50
我也是服了楼主,下面还有程序你不贴上来,那我们哪知道你对a进行了什么操作,它是不是就该要变化呢,要不你就把函数程序都贴出来大家分析分析,要不你就继续稀里糊涂就算了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1