久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2386|回復: 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的值,找不到原因。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1023753 發表于 2022-8-27 15:47 | 只看該作者
一般不會變  
回復

使用道具 舉報

板凳
ID:526108 發表于 2022-8-27 15:57 | 只看該作者
局部變量會改變的
回復

使用道具 舉報

地板
ID:77479 發表于 2022-8-27 17:04 | 只看該作者
一般不會;這個問題很有可能與編譯器優化等級有一點關系。
回復

使用道具 舉報

5#
ID:1041851 發表于 2022-8-27 18:12 | 只看該作者
有可能,這要看調用的函數是什么,一般都是指針未正確初始化造成的。例如函數里有下面類似的語句

char* p;
*p = 0; //指針還未初始化就使用,如果此時指針恰巧指向a的地址,a值就會被修改
回復

使用道具 舉報

6#
ID:94031 發表于 2022-8-27 18:18 | 只看該作者
你 a 定義為局部變量,只在 f2() 內保持不變,出了f2() 就會變,應該定義為全局變量。
回復

使用道具 舉報

7#
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 保護起來。
回復

使用道具 舉報

8#
ID:404160 發表于 2022-8-27 22:12 | 只看該作者
語法上沒問題,可能是RAM溢出(RAM不夠用了,一通計算占用太多RAM)。
回復

使用道具 舉報

9#
ID:68189 發表于 2022-8-27 23:55 | 只看該作者
局部變量a 的生命周期,被局限在子函數f2()中,當執行完f2()中最后一行語句b=f1(x);后它的生命就完結了,至于會變成什么值,那也就聽天由命了。這是我的理解,不知道對不對。還請大家指正
回復

使用道具 舉報

10#
ID:883242 發表于 2022-8-28 07:59 | 只看該作者
新手的通病,一旦找不到問題所在就會懷疑編譯器。
回復

使用道具 舉報

11#
ID:1034262 發表于 2022-8-28 09:27 | 只看該作者
原則上,調用函數不會改變本函數的局部變量,但是樓主的例子中,局部變量給了一個值,后面卻沒有使用,則編譯以可能會優化掉,因為編譯器覺得給局部變量一個值但又不使用,指令就沒有意義,優化掉。
回復

使用道具 舉報

12#
ID:434018 發表于 2022-8-28 10:10 | 只看該作者
可能是堆疊空間不足
回復

使用道具 舉報

13#
ID:416287 發表于 2022-8-28 11:48 來自手機 | 只看該作者
個人理解是有可能會變,雖然a是f2中的局部變量,離開f2函數后,如果調用的其他函數中有指針指向了a的地址,也有可能會變。
回復

使用道具 舉報

14#
ID:883242 發表于 2022-8-28 14:32 | 只看該作者
奮斗的小白熊 發表于 2022-8-28 11:48
個人理解是有可能會變,雖然a是f2中的局部變量,離開f2函數后,如果調用的其他函數中有指針指向了a的地址, ...

是f2()調用的f1(),執行f1()的時候絕對不是“離開了”f2(),你的理解完全錯誤。
回復

使用道具 舉報

15#
ID:59202 發表于 2022-8-28 18:29 | 只看該作者
從程序上看a就是一個賦值為1的局部變量,跟其他沒啥關系,樓主說a偶爾會變是在什么時候輸出的,在f2()函數內輸出的話一般是不可能的,除非編譯上有警告你沒注意;如果是在f2()函數外輸出的話那確實會出錯,因為a出了函數f2后就會被系統銷毀,這時你在原變量的地址取值會得到一個隨機值
回復

使用道具 舉報

16#
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()以外。
回復

使用道具 舉報

17#
ID:612392 發表于 2022-8-29 17:20 | 只看該作者
反正我 現在只能把a定義為全局變量才能保證a的值穩定不變。f2()下面還有其它語句的,不是把a賦1后就不用了。所以這個局部變量有時候真的搞不明白。
回復

使用道具 舉報

18#
ID:59202 發表于 2022-8-29 20:37 | 只看該作者
Hephaestus 發表于 2022-8-28 22:48
你的理解也是錯誤的。在f2()函數以外輸出的時候,a根本就不存在,你怎么在f2()以外輸出a的,寫一句代碼讓 ...

我的意思是樓主在什么時候用什么辦法看到a是非1的值的,是用串口輸出的還是軟件仿真的等等,這點很重要,很多時候看到的并不一定是真實的。初學者寫出非法調用局部變量的值的語句經常都會發生,編譯器也不是每次都報錯。
回復

使用道具 舉報

19#
ID:883242 發表于 2022-8-29 23:02 | 只看該作者
cjjdemon 發表于 2022-8-29 17:20
反正我 現在只能把a定義為全局變量才能保證a的值穩定不變。f2()下面還有其它語句的,不是把a賦1后就不用了 ...

其實你的問題并沒有解決,如果確實如你所述,a作為局部變量被意外更改的話,那么原因基本可以肯定是數組訪問越界造成的,你改成全局變量,a的存儲位置發生了變化,不會被意外改變,但是會有一個你想象不到的變量被意外改變,然后……就是很難解決的bug。
回復

使用道具 舉報

20#
ID:59202 發表于 2022-8-30 14:50 | 只看該作者
我也是服了樓主,下面還有程序你不貼上來,那我們哪知道你對a進行了什么操作,它是不是就該要變化呢,要不你就把函數程序都貼出來大家分析分析,要不你就繼續稀里糊涂就算了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国内av在线 | 日本小视频网站 | 另类一区 | 91久色| 午夜电影网 | h视频在线观看免费 | 视频二区 | 中文字幕一区二区三区日韩精品 | 国产午夜精品一区二区三区四区 | 成人在线a | 国产精品亚洲欧美日韩一区在线 | 午夜小电影 | 国产色片 | 成人小视频在线 | 北条麻妃国产九九九精品小说 | 午夜影院毛片 | 中文字幕精品一区二区三区在线 | 国产精品久久精品 | 国产区在线视频 | 精品福利一区二区三区 | 日本精品一区二区三区在线观看视频 | 在线免费观看欧美 | 中文字幕av亚洲精品一部二部 | 成人免费共享视频 | 亚洲精品久久久久久一区二区 | 精品国产乱码一区二区三区a | 天天久久 | 午夜小视频在线播放 | 黄色小视频大全 | 午夜精品久久久久久久99黑人 | 最新国产精品视频 | 亚洲在线 | 日日夜夜狠狠操 | 欧美亚洲视频在线观看 | 成人午夜免费视频 | 免费观看的av毛片的网站 | www.天天操.com| 亚洲视频免费在线播放 | 曰韩一二三区 | 国产综合av | 欧美极品视频在线观看 |