<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > arm學習筆記--程序中變量引起的思考

          arm學習筆記--程序中變量引起的思考

          作者: 時間:2016-11-10 來源:網(wǎng)絡 收藏
          今天在寫代碼的時候,遇到一個奇怪的問題,在函數(shù)內定義局部變量數(shù)組,如果這個數(shù)組較大時程序就會跑飛,跑飛的地方如下:

          /*這一塊是跑飛的代碼*/
          uint32_t UserCode[244];
          UserCode[0]=1;
          /*代碼over*/

          本文引用地址:http://www.ex-cimer.com/article/201611/317288.htm如果數(shù)組比較小的話就沒有問題,然后我上網(wǎng)查了一下資料這里理一下:
          1、由于局部變量創(chuàng)建的時候是靜態(tài)創(chuàng)建在棧上的,所以棧的大小限制了局部變量的size,如果棧小了,在運行的時候就會出現(xiàn)溢出,程序當然就飛了。這里就有概念上的疑問了:靜態(tài)創(chuàng)建和動態(tài)創(chuàng)建區(qū)別是什么?局部變量占用的是棧的空間,那么其他類型的變量呢?下面我們就來看這個問題。
          2、靜態(tài)創(chuàng)建和動態(tài)創(chuàng)建的區(qū)別
          我個人的理解:靜態(tài)創(chuàng)建分為兩個部分,一個是編譯時,這個時候我們定義的靜態(tài)變量和全局變量將在自動劃分內存空間;一個是在運行時,就是局部變量,在棧區(qū)生成一個固定大小的空間;為什么說他是靜態(tài)的呢?因為這些變量或數(shù)組空間的大小我們是預先可知的。而動態(tài)創(chuàng)建呢?我們使用malloc和free創(chuàng)建和釋放內存空間,他們的大小是按需分配,所以是動態(tài)創(chuàng)建,是在堆上分配的。
          3、變量類型分為:局部變量,靜態(tài)局部變量,全局變量,靜態(tài)全局變量。他們在存儲上可以根據(jù)創(chuàng)建的方式進行分析,靜態(tài)和全局都是在編譯是進行創(chuàng)建的,所以是在普通的內存區(qū)域,局部變量是在運行時創(chuàng)建的,在棧上,但是棧上的空間和普通內存區(qū)域有沒有重復呢?這個目前我還不清楚,還需要繼續(xù)加深理解。在作用域上:局部變量在調用函數(shù)的時候創(chuàng)建,返回的時候系統(tǒng)自己進行銷毀;全局變量可以在工程的所有單元文件下使用;靜態(tài)全局變量只能在當前單元文件下使用;靜態(tài)局部變量,只創(chuàng)建一次,函數(shù)返回的時候不對他進行任何操作,所以下次進函數(shù)的時候他保留的是上一次的值,不會清除。
          4、堆和棧的區(qū)別:堆用于動態(tài)分配空間等,由程序員創(chuàng)建和操作;棧是由編譯器自動分配的,主要用于存放函數(shù)的參數(shù)值和局部變量。平時說的函數(shù)調用或中斷入棧等等都是指的這里編譯器分配的棧。
          好,現(xiàn)在我們回到剛剛的出現(xiàn)問題的代碼上來,然后我們看看怎么解決,由于分析出是棧不夠的情況,所以我們就可以通過其他兩種方式解決:
          1、改變變量數(shù)組類型:全局或靜態(tài)的,這樣由編譯器分配內存
          2、使用malloc動態(tài)分配空間:由于malloc不占用棧區(qū),所以也可以我們先改為全局變量試試


          關鍵詞: arm程序變

          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();