新聞中心

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

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

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

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

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


        關鍵詞: arm程序變

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 威信县| 西乌| 墨竹工卡县| 虹口区| 分宜县| 称多县| 汕头市| 喜德县| 台中县| 吕梁市| 东乌珠穆沁旗| 商都县| 新乡县| 无锡市| 峡江县| 通州市| 河津市| 长宁区| 库尔勒市| 林西县| 曲麻莱县| 凯里市| 望江县| 灌南县| 普兰县| 崇州市| 东光县| 翁源县| 安国市| 济南市| 秦皇岛市| 安塞县| 凤山市| 常州市| 社旗县| 舟曲县| 平凉市| 德兴市| 永泰县| 弋阳县| 新干县|