wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

指針過界引起全局變量改變的錯誤

作者:huqin   來源:本站原創   點擊數:  更新時間:2014年11月10日   【字體:

  最近,在寫程序的時候,碰到一個在自己看來非常不可思議的問題。當然,或者高手就覺得大驚少怪了,呵呵。

 

  以下是問題相關:

  平臺:MEGA64;

  編譯環境:codeVisonAVR;

  問題:一個全局變量在定義的時候直接賦值為0,但在程序運行過程中,沒有改變該變量的操作,可是奇怪的是,程序在運行一段時間之后,這個全局變量居然自動改變了。

  發現問題之后,我很難理解,一直無法找到原因。

  一開始,我就懷疑是不是哪里的存儲空間溢出重疊了,但由于對各種變量的存儲位置,不是十分的了解,也就沒有再對此做更深層的探究;其次,我懷疑是不是哪里的指針跳錯了,跳到全局變量那里,造成全局變量的改變,不過對于這一點,我又自認很仔細的檢查了程序,的確沒有發現指針跳錯的地方。

  現在看來,其實,我的兩個懷疑,都和指針有關的。

  后來,和志剛討論一下,他一開始就提出:是不是堆設置不夠。他說的堆是指hardware stack,我一開始不知道什么是hardware stack的。我猜他的意思是說,用于程序返回堆棧的空間太小了,以至于,硬件堆棧溢出,覆蓋了全局變量,自然造成全局變量的改變。

  一開始我沒有弄懂他的意思。明白之后,我覺得很有可能,不過,仔細看編譯結果,又大概可以排除這個可能了,以下是編譯結果:

Bit variables area: 2h to 2h
Bit variables size: 1 byte(s)

Data Stack area: 100h to 4FFh
Data Stack size: 1024 byte(s)
Estimated Data Stack usage: 98 byte(s)

Global variables area: 500h to 5DCh
Global variables size: 221 byte(s)

Hardware Stack area: 5DDh to 10FFh
Hardware Stack size: 2851 byte(s)

  從最后一行可知,硬件堆棧大得很,4K的SRAM,已占2.8K。一般來說,就算是函數多層嵌入也不可能占如此之大的空間,網上說,就算浮點函數,40B都已經足夠。

  不過,由于志剛的提示,讓我注意到上面的編譯結果,以前我不知道全局變量是怎樣存儲的,現在就明白了,上面倒數3、4行,就是說全局變量的。可見,全局變量是保存在數據堆棧與硬件堆棧的中間,剛才志剛說,可能硬件堆棧溢出,造成全局變量的改變。雖然在這里這個可能不大了,但是,同理,會不會是數據堆棧溢出,造成全局變量的改變呢?因為,由上面幾行編譯結果可知,全局變量正處于數據堆棧和硬件堆棧之間,兩者的溢出皆有可能造成全局變量的改變。不過,“Estimated Data Stack usage: 98 byte(s)”,這里又很明顯提示,估算的數據堆棧實際用到的大小只有98B,也遠遠小于1024B。

  所以說,不管是數據堆棧還是硬件堆棧,兩者都很難簡單的溢出。

  下面是我在codeVisionAVR的幫助文檔上面找到關于RAM的結構圖:


 

  可知,codeVisionAVR是如何分配SRAM的(其它編譯器,各不相同的),這里簡單述說,以備以后參考。以maga64為例。(芯片資料說的4K SRAM,是不包括地址前面的100B的,也就是說SRAM的大小從數據堆棧開始數起)

  首先是,32個工作寄存器+64個I/O寄存器,這里占了RAM地址分配的前100字節,0H-99H;

  其次是,數據堆棧,而且是由高往低堆的,也就是,先從地址高處往低處進棧,由于它是用Y寄存器來做數據堆棧的指針的,所以,數據堆棧就從Y的初始值開始,到地址100H結尾,這個大小可以在編譯器工程設置里面設置,一般可以先編譯程序,看編譯估算的實際數據棧使用大小,再去定數據堆棧的大小,自然要定大一點,防止溢出。主要用于動態儲存局部變量、函數參數和中斷時各工作狀態寄存器的值;

  接著是,全局變量區域,這個是編譯器通過統計程序的全局變量數量而定的。用于保存全局變量;

  再接著是,硬件堆棧,以SP初始值開始,到全局變量最高地址為止,而且和數據堆棧一樣,也是由高往低堆的。用于保存函數返回地址;

  最后是,堆(heap),是malloc, calloc, realloc and free等鏈表函數用來建立鏈表的內存空間,如果不使用這個函數,必須設置為0.

  由上面可知,由于全局變量處于數據堆棧和硬件堆棧中間,而后兩者都是由高往低進棧的,所以說,如果正常溢出,只能是硬件堆棧溢出才可以造成全局變量的改變,而數據堆棧的溢出不可能造成這個問題。可是現在硬件堆棧這么多,也幾乎不可能是它溢出造成這個問題的。

  那會是什么原因造成上面那個問題的呢?分析之后,我重新再仔細查找程序,最后還是找到了原因。還好,這些程序原先不是我寫的,呵呵。

  有一個以數組的地址指針為參數的函數example(char *pTemp),主函數調用它的時候,傳一個4位數組temp[4]給它,如:example(temp);

  下面大略的代碼:

  main()

  {

    char temp[4];

    example(temp);

  }

  length[]={1,2,4};

  example(char *pTemp)

  {

    cLength=length[getIndex()];

    for(i=0;i<clength;i++)

    {

      *pTemp=readvalue();

      pTemp++;

    }

  }

  由于length是一個3位數組,如果getIndex()的值大于2,就造成cLength得到的值不在{1,2,4}內,而是儲存length[]={1,2,4}往后地址的值,這個值是不確定的,很有可能是遠遠大于4。這樣就造成,for里面的循環次數遠遠大于4次,因為,指針*pTemp本來指向一個4位的數組temp[4],現在由于pTemp++超過3次,已經不是指向temg[]這個4位數組了,而是大于temp[4]地址的地址了。

  我們知道,這個temp[]是一個局部變量,它應該保存在SRAM的數據堆棧里面,而數據堆棧是由高往低進棧的,緊挨著的就是全局變量區域,這個temp必定就是保存在離全局變量區域不遠的數據堆棧里面。于是,只要for的次數夠大,它不但改變了比temp后進的數據堆棧的數據,而且,跨過數據堆棧與全局變量區域的界限,直接修改了全局變量的某些值!

  其實,原來寫這個程序的人,已經做個防止getIndex()大于2的處理,可是呢,悲劇的是length[]卻少了一位數。呵呵,好在我究竟還是數了數它的位數(在實際的那個程序里,這個數組的位數自然不會是3位這么少,這樣一眼就可以看出來少不少。)。不過,如果不是志剛的提示,讓我提起心思去了解存儲空間的問題,即使我數出來位數少了一位,也不一定知道問題的根本原因所在!

  其實,這里就是指針惹的禍。不怪人家說,指針是C、C++的靈魂啊——你知道,靈魂這東西,雖然有可能是個天使,也有可能是個惡魔。

 

關閉窗口

相關文章

国产日韩精品一区| 国产精品久久久久久久久久久久| 99re成人在线| 日韩精品dvd| www.综合| 天天色天天色| 成人1区2区3区| 中国av免费看| 黄色成人在线看| 不卡视频一区| 欧美激情第一页xxx| 欧美午夜片在线看| 国产精品视频线看| 日日夜夜一区二区| 一区三区在线欧| 综合久久2023| 国产精品二线| 小次郎av收藏家| 原谅我中文字幕| 天天操夜夜操视频| 黄色国产在线观看| 日日摸天天爽天天爽视频| 狠狠久久综合婷婷不卡| 91av网站在线播放| 亚洲最新在线视频| 欧美曰成人黄网| 日本一区二区三区四区| 免费一级欧美片在线观看| 三上亚洲一区二区| 99综合99| 欧美13videosex性极品| 日本一本草久在线中文| 黄色网免费观看| 亚洲欧美自拍另类| 国产一区二区在线视频聊天| 久久国产美女视频| 特黄特色免费视频| 亚洲成熟丰满熟妇高潮xxxxx| 国产成人亚洲欧美| 日本精品久久久| 精品久久久91| 精品伊人久久97| 91精品国产91久久久久久一区二区 | www视频免费看| 性xxxxbbbb| 亚洲永久精品视频| 日本午夜精品理论片a级app发布| 91资源在线播放| 日本高清久久久| 欧美精品一区免费| 18视频在线观看娇喘| 精品久久久久久乱码天堂| 国产精品1234| 欧美专区在线播放| 国模私拍视频一区| 日韩在线视频国产| 在线日韩av观看| **网站欧美大片在线观看| 成人免费看视频| 精品一区二区日韩| 久久精品国产在热久久| 日韩在线观看一区二区| 久久九九电影| 亚洲人妖在线| 精品96久久久久久中文字幕无| 色综合五月天| 色综合五月天| 亚洲综合中文| 午夜久久tv| 亚洲成人在线| 亚洲美女视频在线免费观看| 欧美日韩三级| 在线电影一区| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲女人av| 日韩国产高清在线| 日韩经典一区二区| 激情成人综合网| 国产一区二区不卡老阿姨| 国内外成人在线| 国产精品亚洲一区二区三区在线 | 亚洲精品aaa| 日本免费成人| 一区二区三区视频播放| 777久久精品| 天天躁日日躁成人字幕aⅴ| 97视频一区| 亚洲人成网77777色在线播放| 亚洲制服一区| 午夜激情久久| 一区二区三区国产盗摄| 噜噜噜久久亚洲精品国产品小说| 日本不卡的三区四区五区| 久久9热精品视频| 99久久99久久综合| 国产欧美精品区一区二区三区| 最新热久久免费视频| 亚洲自拍偷拍av| 黑人巨大精品欧美一区二区一视频| 一本大道久久a久久精二百| 欧美精品少妇一区二区三区| 亚洲高清不卡av| 中文字幕九色91在线| 欧美成人全部免费| 日本视频久久久| 国产精品国色综合久久| 中文字幕中文字幕一区三区| 狠狠97人人婷婷五月| 一二三级黄色片| 日韩一区二区a片免费观看| 国产在线一二区| 国产日韩免费视频| 豆国产97在线|亚洲| 国产视频一二| 男女啪啪在线观看| 成人在线免费av| 精品免费av| 天堂资源在线中文精品| 97成人超碰视| 午夜精品一区二区三区电影天堂| 欧美一区二区三区在线观看视频| 原创国产精品91| 国产成人一区二| 九九久久99| 男女av免费观看| 国产精品无码午夜福利| 在线观看日本网站| 日韩综合另类| 天海翼一区二区三区四区在线观看| 中文字幕伦理免费在线视频| 91在线一区| 在线观看亚洲| 久久精品人人做人人综合 | 黑人性受xxxx黑人xyx性爽| 性欧美孕妇孕交| 一本大道色婷婷在线| 五月天亚洲一区| 蜜桃视频在线一区| 亚洲激情图片qvod| 日韩精品日韩在线观看| 国产精品精品视频| 大地资源网在线观看免费官网 | 婷婷5月激情5月| 清纯唯美亚洲色图| 日韩午夜电影免费看| 欧美日韩国产成人精品| av在线不卡免费看| 欧美特级限制片免费在线观看| 精品国内自产拍在线观看| 国产伦精品一区二区三区四区免费 | 精品久久免费视频| 色就是色欧美色图| 麻豆国产在线播放| 国产亚洲高清一区| 爽好久久久欧美精品| 亚洲日本中文字幕区| 日韩成人在线视频观看| 91久久久久久| 日韩网址在线观看| 久操免费在线视频| 国产日韩欧美第一页| 黄网站在线观看| av综合网址| 国产一区二区美女| 在线欧美小视频| 91国产中文字幕| 成人黄色片免费| 精品国产视频一区二区三区| 天堂中文在线观看| aaa在线观看| japanese国产精品| 国产欧美一区二区精品性色超碰| 亚洲国产另类久久精品| 国产视频在线观看一区| 最好看的中文字幕| 超碰福利在线观看| 四虎影视在线播放| 欧洲亚洲视频| 久久蜜桃一区二区| 亚洲乱码一区av黑人高潮| 国产日韩欧美精品| wwwxx日本| 亚洲一卡2卡三卡4卡2021四卡| 国产原创av在线| 最新亚洲精品| 亚洲国产经典视频| 久久夜色精品国产| 免费看日b视频| 在线看成人av| 91免费日韩| 成人爽a毛片免费啪啪红桃视频| 国产福利91精品| 亚洲成人网av| 日韩久久不卡| 翔田千里88av中文字幕| 美女三级福利视频| 国产视频网站一区二区三区| 91丨九色porny丨蝌蚪| 一区二区欧美激情| 欧美性受xxxx黑人猛交88| 久久久全国免费视频| av电影免费在线| 日本成人手机在线| 久久久99精品久久| 欧美激情久久久久| 在线免费观看av的网站| 成人午夜免费福利| 日韩免费影院| 蜜桃久久久久久| 亚洲国产精品大全| 中文字幕一区二区三区有限公司 | 欧美丰满少妇人妻精品| 九九精品视频在线观看九九| 亚洲男人av| 国产福利一区二区三区在线视频| 亚洲午夜小视频| 欧美一级特黄aaaaaa在线看片| 福利一区二区三区四区| h短视频大全在线观看| 欧美日韩中字| 欧美性xxxx极品hd满灌| 国产成人精品福利一区二区三区 | 欧美精品性生活| 人人妻人人澡人人爽人人欧美一区 | 亚洲风情第一页| 国产极品人妖在线观看| 美女看a上一区| 亚洲免费人成在线视频观看| 久久久久久久香蕉| 国产精品女人久久久| 成人免费高清| 麻豆精品精品国产自在97香蕉| 亚洲免费电影一区| 欧美私人情侣网站| 青青草社区在线| 成人在线黄色| 中文在线一区二区| 91精品久久久久| 国产精品视频一区二区在线观看| 午夜影院在线| 亚洲日本视频| 亚洲精品在线91| 黄色国产小视频| 久久免费精品一区二区| xxxxxhd亚洲人hd| 欧美日韩免费一区| 欧美精品成人一区二区在线观看| 特级西西444www大精品视频免费看| 国产在线自天天| 极品尤物av久久免费看| 久久综合久久88| 人妻av一区二区| gay视频丨vk| 日韩天堂av| 中文字幕欧美精品在线| 毛片毛片毛片毛| 毛片网站免费| 91精品精品| 亚洲国产精品国自产拍av秋霞 | 四虎海外永久免费网址| 成人精品毛片| 欧美四级电影在线观看| 91视频 - 88av| 免费永久在线观看黄网| 欧美日韩直播| 91精品在线观看入口| 97视频久久久| 色内内免费视频播放| 午夜激情久久| 国产一区二区三区视频| 日本成人在线免费| 黄色三及免费看| 日韩在线播放一区二区| 久久久亚洲欧洲日产国码aⅴ| 中文字幕伦理片| av大片在线播放| 91日韩一区二区三区| 99久久综合狠狠综合久久止 | 国产一区红桃视频| 精品成人久久久| 99thz桃花论族在线播放| 国产精品久久夜| 九色视频成人porny| 国产男男gay体育生网站| 超薄肉色丝袜脚交一区二区| 亚洲国产人成综合网站| 人妻无码一区二区三区四区| 另类free性欧美护士| 欧美亚洲精品在线| 亚洲男人天堂视频| 日韩综合第一页| 午夜成人影视| 91丨porny丨蝌蚪视频| 国产一区二区三区高清| 精品欧美一区二区精品少妇| 国产激情综合| 日韩午夜在线播放| 国产又粗又猛又爽又黄| 在线国产三级| 91在线观看污| 欧美一区二区三区精美影视| 激情在线观看视频| jizzjizzji欧美| 国精产品一区一区三区mba视频| 国产精品免费一区豆花| 中文资源在线播放| 岛国精品一区| 亚洲欧美成人在线| 天堂av网手机版| 三级中文字幕在线观看| 在线免费观看视频一区| 日本精品一区在线| 精品影院一区| 亚洲乱码国产乱码精品精98午夜| 粉嫩av一区二区三区天美传媒 | 国产精品久久久网站| 亚洲国产成人精品久久久国产成人一区| 亚洲AV无码久久精品国产一区| 五丁香在线视频| 中文字幕在线一区二区三区| 国产性生活免费视频| 色视频网站在线| 顶级嫩模精品视频在线看| 欧美不卡三区| 91p0rn永久地址| 久国产精品韩国三级视频| 国产精品麻豆免费版| 欧美性色黄在线视频| 久久久噜噜噜| 国产精品久久久久久久久婷婷| 欧美性受xxxx免费视频| 久热成人在线视频| 久久精品国产美女| 国产视频二区三区| 国产在线播放一区| 欧美在线日韩精品| 公交车上扒开嫩j挺进去| 国产成人一级电影| 中文一区一区三区免费| 免费观看视频www| 91麻豆免费看| 久久国产精品免费观看| 久久综合色播| 成人欧美一区二区三区1314| 日韩视频在线免费看| 福利成人在线观看| 色8久久精品久久久久久蜜| 97香蕉碰碰人妻国产欧美| 成人免费图片免费观看| 欧美zozo另类异族| 亚洲国产美女视频| 精品国产导航| 久久久在线视频| 丁香花免费高清完整在线播放| 99精品热6080yy久久| 精品1区2区| av美女网站| 国产视频在线观看一区二区三区| 欧美a v在线播放| 毛片在线播放网站| 在线免费观看日韩欧美| 免费看黄色三级| 第一区第二区在线| 97av在线视频| 亚洲综合在线不卡| 狠狠色综合播放一区二区| 欧美h视频在线观看| 成视频在线免费观看| 五月激情综合网| 免费网站在线高清观看| 国产欧美日韩电影| 69av成年福利视频| 丝袜理论片在线观看| 成人免费观看视频| 国产男女在线观看| 在线观看午夜av| 亚洲大胆人体在线| 日本高清不卡码| 亚洲人成免费| 亚洲一区二区在线免费观看| 久热免费在线视频| 91网站在线观看视频| 在线观看免费黄网站| 樱桃视频成人在线观看| 久久精品成人动漫| 亚洲色图视频在线观看| 岛国av在线一区| 国产精品亚洲二区在线观看| 国产高潮在线| 久久精品国产一区| 男女作爱免费网站| 96av麻豆蜜桃一区二区| 伊人网在线综合| 91国产精品| 国产精品99久久99久久久二8| 91中文字幕| 亚洲国产精品麻豆| 国产乱子轮xxx农村| 亚洲国产精品成人| 视频在线精品一区|