音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(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 欄目:單片機
學(xué)習(xí)C51過程中有個問題不解.高手勿笑.
如下程序:
程序中各定義二個函數(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
兩個函數(shù)的k分別初始化一下
 
3樓: >>參與討論
computer00
KEIL51把局部變量分配在相同的地址了。因為不會同時用到。
你聲明成static的,將會被分配到不同的地址。

對于局部變量,不初始化將得到不可預(yù)知的值。

4樓: >>參與討論
gbchang
那個稱之為"動態(tài)變量",就是動態(tài)分配的,C知識,地址當然可能重疊.
C語言知識,
與MCU無關(guān).


5樓: >>參與討論
dandywang
這種情況一般不會出現(xiàn)吧
一般情況下好像是不會重疊的

6樓: >>參與討論
ehu
隨機的
因為你的text函數(shù)即沒有參數(shù)輸入,又沒有對內(nèi)部變量的初始化,那就基本上沒任何意義,所以相同地址也無所謂

7樓: >>參與討論
ihafd
謝謝各位.我明白了.
總結(jié)如下:
   由于沒把k初始化,調(diào)用函數(shù)里是隨機給k分配地址的.而我又比較幸運,調(diào)用的兩個函數(shù)里都分配了相同的地址給k ,所以出現(xiàn)了以上情況.
  
   這樣說不知正確否?

8樓: >>參與討論
computer00
再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
回復(fù)
對!兩個函數(shù)的k分別初始化一下

10樓: >>參與討論
chenzhen
{}的問題吧
你這個在主函數(shù)中的for語句沒有用{}那么就執(zhí)行for后面的一句,而不是你要的三句語句了吧?纯词遣皇

11樓: >>參與討論
playxzy
看了各位的分析,我也收益很大,強頂。
 
12樓: >>參與討論
chunk
這決不是個簡單的問題
如果你從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樓: >>參與討論
艾森豪威爾
最好別打這種擦邊球
改個名字不就得了

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
proteus + keil c51聯(lián)機調(diào)試 詳細圖文教程
51開發(fā)板上的晶振的兩個管腳電壓46.8mv,是不是壞了?
求教:I2C讀取問題
W78E58B 純軟件方式ISP不成功,有勞大蝦指點.
請問Keil51中,查詢存儲器內(nèi)容的地址設(shè)置問題
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號