找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1014|回复: 19
收起左侧

子函数定义的局部变量问题求助

  [复制链接]
ID:612392 发表于 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的值,找不到原因。

回复

使用道具 举报

ID:1023753 发表于 2022-8-27 15:47 | 显示全部楼层
一般不会变  
回复

使用道具 举报

ID:526108 发表于 2022-8-27 15:57 | 显示全部楼层
局部变量会改变的
回复

使用道具 举报

ID:77479 发表于 2022-8-27 17:04 | 显示全部楼层
一般不会;这个问题很有可能与编译器优化等级有一点关系。
回复

使用道具 举报

ID:1041851 发表于 2022-8-27 18:12 | 显示全部楼层
有可能,这要看调用的函数是什么,一般都是指针未正确初始化造成的。例如函数里有下面类似的语句

char* p;
*p = 0; //指针还未初始化就使用,如果此时指针恰巧指向a的地址,a值就会被修改
回复

使用道具 举报

ID:94031 发表于 2022-8-27 18:18 | 显示全部楼层
你 a 定义为局部变量,只在 f2() 内保持不变,出了f2() 就会变,应该定义为全局变量。
回复

使用道具 举报

ID:624769 发表于 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 保护起来。
回复

使用道具 举报

ID:404160 发表于 2022-8-27 22:12 | 显示全部楼层
语法上没问题,可能是RAM溢出(RAM不够用了,一通计算占用太多RAM)。
回复

使用道具 举报

ID:68189 发表于 2022-8-27 23:55 | 显示全部楼层
局部变量a 的生命周期,被局限在子函数f2()中,当执行完f2()中最后一行语句b=f1(x);后它的生命就完结了,至于会变成什么值,那也就听天由命了。这是我的理解,不知道对不对。还请大家指正
回复

使用道具 举报

ID:883242 发表于 2022-8-28 07:59 | 显示全部楼层
新手的通病,一旦找不到问题所在就会怀疑编译器。
回复

使用道具 举报

ID:1034262 发表于 2022-8-28 09:27 | 显示全部楼层
原则上,调用函数不会改变本函数的局部变量,但是楼主的例子中,局部变量给了一个值,后面却没有使用,则编译以可能会优化掉,因为编译器觉得给局部变量一个值但又不使用,指令就没有意义,优化掉。
回复

使用道具 举报

ID:434018 发表于 2022-8-28 10:10 | 显示全部楼层
可能是堆叠空間不足
回复

使用道具 举报

ID:416287 发表于 2022-8-28 11:48 来自手机 | 显示全部楼层
个人理解是有可能会变,虽然a是f2中的局部变量,离开f2函数后,如果调用的其他函数中有指针指向了a的地址,也有可能会变。
回复

使用道具 举报

ID:883242 发表于 2022-8-28 14:32 | 显示全部楼层
奋斗的小白熊 发表于 2022-8-28 11:48
个人理解是有可能会变,虽然a是f2中的局部变量,离开f2函数后,如果调用的其他函数中有指针指向了a的地址, ...

是f2()调用的f1(),执行f1()的时候绝对不是“离开了”f2(),你的理解完全错误。
回复

使用道具 举报

ID:59202 发表于 2022-8-28 18:29 | 显示全部楼层
从程序上看a就是一个赋值为1的局部变量,跟其他没啥关系,楼主说a偶尔会变是在什么时候输出的,在f2()函数内输出的话一般是不可能的,除非编译上有警告你没注意;如果是在f2()函数外输出的话那确实会出错,因为a出了函数f2后就会被系统销毁,这时你在原变量的地址取值会得到一个随机值
回复

使用道具 举报

ID:883242 发表于 2022-8-28 22:48 | 显示全部楼层
xxxevery 发表于 2022-8-28 18:29
从程序上看a就是一个赋值为1的局部变量,跟其他没啥关系,楼主说a偶尔会变是在什么时候输出的,在f2()函 ...

你的理解也是错误的。在f2()函数以外输出的时候,a根本就不存在,你怎么在f2()以外输出a的,写一句代码让我也乐一乐。当然按我在14楼的说法,f2()调用f1(),在f1()内输出不属于f2()以外。
回复

使用道具 举报

ID:612392 发表于 2022-8-29 17:20 | 显示全部楼层
反正我 现在只能把a定义为全局变量才能保证a的值稳定不变。f2()下面还有其它语句的,不是把a赋1后就不用了。所以这个局部变量有时候真的搞不明白。
回复

使用道具 举报

ID:59202 发表于 2022-8-29 20:37 | 显示全部楼层
Hephaestus 发表于 2022-8-28 22:48
你的理解也是错误的。在f2()函数以外输出的时候,a根本就不存在,你怎么在f2()以外输出a的,写一句代码让 ...

我的意思是楼主在什么时候用什么办法看到a是非1的值的,是用串口输出的还是软件仿真的等等,这点很重要,很多时候看到的并不一定是真实的。初学者写出非法调用局部变量的值的语句经常都会发生,编译器也不是每次都报错。
回复

使用道具 举报

ID:883242 发表于 2022-8-29 23:02 | 显示全部楼层
cjjdemon 发表于 2022-8-29 17:20
反正我 现在只能把a定义为全局变量才能保证a的值稳定不变。f2()下面还有其它语句的,不是把a赋1后就不用了 ...

其实你的问题并没有解决,如果确实如你所述,a作为局部变量被意外更改的话,那么原因基本可以肯定是数组访问越界造成的,你改成全局变量,a的存储位置发生了变化,不会被意外改变,但是会有一个你想象不到的变量被意外改变,然后……就是很难解决的bug。
回复

使用道具 举报

ID:59202 发表于 2022-8-30 14:50 | 显示全部楼层
我也是服了楼主,下面还有程序你不贴上来,那我们哪知道你对a进行了什么操作,它是不是就该要变化呢,要不你就把函数程序都贴出来大家分析分析,要不你就继续稀里糊涂就算了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表