|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
學(xué)習(xí)C51過程中有個問題不解.高手勿笑. |
| 作者:ihafd 欄目:單片機 |
如下程序: 程序中各定義二個函數(shù)void text(void);和void text2(void);,函數(shù)內(nèi)各定義了一個unCHAR k; 按照書本上說兩個函數(shù)內(nèi)的unCHAR k;應(yīng)該屬于各自的函數(shù)的,不會相互影響(當然這種編程習(xí)慣不可取).但我在調(diào)試過程中發(fā)現(xiàn).k的值不是相互獨立的.運行完text()后,會把k的值帶到text2()的.為什么會這樣啦? #include<reg51.h> typedef unsigned CHAR unCHAR; void text(void); void text2(void); main() { unCHAR i,j; while(1) { for (i=0;i<2;i++) text(); j++; text2(); } } void text(void) { unCHAR k; k++; } void text2(void) { unCHAR k; k=k+2; } * - 本貼最后修改時間:2005-11-24 17:35:57 修改者:ihafd |
| 2樓: | >>參與討論 |
| 作者: TdwMCU 于 2005/11/24 17:46:00 發(fā)布:
兩個函數(shù)的k分別初始化一下 |
|
| 3樓: | >>參與討論 |
| 作者: computer00 于 2005/11/24 18:13:00 發(fā)布:
KEIL51把局部變量分配在相同的地址了。因為不會同時用到。 你聲明成static的,將會被分配到不同的地址。 對于局部變量,不初始化將得到不可預(yù)知的值。 |
|
| 4樓: | >>參與討論 |
| 作者: gbchang 于 2005/11/24 18:43:00 發(fā)布:
那個稱之為"動態(tài)變量",就是動態(tài)分配的,C知識,地址當然可能重疊. C語言知識, 與MCU無關(guān). |
|
| 5樓: | >>參與討論 |
| 作者: dandywang 于 2005/11/24 21:16:00 發(fā)布:
這種情況一般不會出現(xiàn)吧 一般情況下好像是不會重疊的 |
|
| 6樓: | >>參與討論 |
| 作者: ehu 于 2005/11/24 22:27:00 發(fā)布:
隨機的 因為你的text函數(shù)即沒有參數(shù)輸入,又沒有對內(nèi)部變量的初始化,那就基本上沒任何意義,所以相同地址也無所謂 |
|
| 7樓: | >>參與討論 |
| 作者: ihafd 于 2005/11/25 8:27:00 發(fā)布:
謝謝各位.我明白了. 總結(jié)如下: 由于沒把k初始化,調(diào)用函數(shù)里是隨機給k分配地址的.而我又比較幸運,調(diào)用的兩個函數(shù)里都分配了相同的地址給k ,所以出現(xiàn)了以上情況. 這樣說不知正確否? |
|
| 8樓: | >>參與討論 |
| 作者: computer00 于 2005/11/25 9:16:00 發(fā)布:
再re 一下: 對于keil,局部變量并不是在調(diào)用函數(shù)時隨機分配的,而是在編譯時就已經(jīng)定了下來。也就是說, 所分配到的地址是固定的,你可以做一個驗證,每次調(diào)用那個函數(shù)時,把它的地址顯示出來, 你會發(fā)現(xiàn)其實是同一個地址。另外,你也可以通過查看編譯后的的匯編代碼來驗證。 假設(shè)兩個函數(shù),每個函數(shù)內(nèi)部只聲明了一個變量,且這兩個函數(shù)只被主函數(shù)調(diào)用,你會發(fā)現(xiàn), 原來這兩個函數(shù)里面的那個變量,是被分配在同一個地址的。這就是keil的內(nèi)存覆蓋,關(guān)于這點, 你可以查看keil的用戶手冊,或者寫段代碼再查看匯編結(jié)果驗證。 注:以上所說的,指一般情況下的普通函數(shù)。 這就是為什么你所說的,“運行完text()后,會把k的值帶到text2()”,因為其實它們 根本就是同一個地址。 當然,如果你不想深入了解的話,認為這個地址是隨機分配的也行,總之知道有這么回事就行了。 |
|
| 9樓: | >>參與討論 |
| 作者: jhx19807 于 2005/11/25 11:05:00 發(fā)布:
回復(fù) 對!兩個函數(shù)的k分別初始化一下 |
|
| 10樓: | >>參與討論 |
| 作者: chenzhen 于 2005/11/25 14:32:00 發(fā)布:
{}的問題吧 你這個在主函數(shù)中的for語句沒有用{}那么就執(zhí)行for后面的一句,而不是你要的三句語句了吧?纯词遣皇 |
|
| 11樓: | >>參與討論 |
| 作者: playxzy 于 2005/11/25 16:21:00 發(fā)布:
看了各位的分析,我也收益很大,強頂。 |
|
| 12樓: | >>參與討論 |
| 作者: chunk 于 2005/11/25 17:54:00 發(fā)布:
這決不是個簡單的問題 如果你從main()先調(diào)text()再調(diào)text2()就有可能出現(xiàn)你說的情況,而如果你從main()調(diào)用text(),而從text()調(diào)用text2()就絕不會有你說的情況。 KEIL C51有這特性,CodeWarrior針對MC68XX系列MCU的C編譯器也有這特性。編譯器的設(shè)計者是對這問題是有想法的。 |
|
| 13樓: | >>參與討論 |
| 作者: 艾森豪威爾 于 2005/11/30 8:41:00 發(fā)布:
最好別打這種擦邊球 改個名字不就得了 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |