arm學(xué)習(xí)筆記--程序中變量引起的思考
/*這一塊是跑飛的代碼*/
uint32_t UserCode[244];
UserCode[0]=1;
/*代碼over*/
1、由于局部變量創(chuàng)建的時(shí)候是靜態(tài)創(chuàng)建在棧上的,所以棧的大小限制了局部變量的size,如果棧小了,在運(yùn)行的時(shí)候就會(huì)出現(xiàn)溢出,程序當(dāng)然就飛了。這里就有概念上的疑問(wèn)了:靜態(tài)創(chuàng)建和動(dòng)態(tài)創(chuàng)建區(qū)別是什么?局部變量占用的是棧的空間,那么其他類型的變量呢?下面我們就來(lái)看這個(gè)問(wèn)題。
2、靜態(tài)創(chuàng)建和動(dòng)態(tài)創(chuàng)建的區(qū)別
我個(gè)人的理解:靜態(tài)創(chuàng)建分為兩個(gè)部分,一個(gè)是編譯時(shí),這個(gè)時(shí)候我們定義的靜態(tài)變量和全局變量將在自動(dòng)劃分內(nèi)存空間;一個(gè)是在運(yùn)行時(shí),就是局部變量,在棧區(qū)生成一個(gè)固定大小的空間;為什么說(shuō)他是靜態(tài)的呢?因?yàn)檫@些變量或數(shù)組空間的大小我們是預(yù)先可知的。而動(dòng)態(tài)創(chuàng)建呢?我們使用malloc和free創(chuàng)建和釋放內(nèi)存空間,他們的大小是按需分配,所以是動(dòng)態(tài)創(chuàng)建,是在堆上分配的。
3、變量類型分為:局部變量,靜態(tài)局部變量,全局變量,靜態(tài)全局變量。他們?cè)诖鎯?chǔ)上可以根據(jù)創(chuàng)建的方式進(jìn)行分析,靜態(tài)和全局都是在編譯是進(jìn)行創(chuàng)建的,所以是在普通的內(nèi)存區(qū)域,局部變量是在運(yùn)行時(shí)創(chuàng)建的,在棧上,但是棧上的空間和普通內(nèi)存區(qū)域有沒(méi)有重復(fù)呢?這個(gè)目前我還不清楚,還需要繼續(xù)加深理解。在作用域上:局部變量在調(diào)用函數(shù)的時(shí)候創(chuàng)建,返回的時(shí)候系統(tǒng)自己進(jìn)行銷毀;全局變量可以在工程的所有單元文件下使用;靜態(tài)全局變量只能在當(dāng)前單元文件下使用;靜態(tài)局部變量,只創(chuàng)建一次,函數(shù)返回的時(shí)候不對(duì)他進(jìn)行任何操作,所以下次進(jìn)函數(shù)的時(shí)候他保留的是上一次的值,不會(huì)清除。
4、堆和棧的區(qū)別:堆用于動(dòng)態(tài)分配空間等,由程序員創(chuàng)建和操作;棧是由編譯器自動(dòng)分配的,主要用于存放函數(shù)的參數(shù)值和局部變量。平時(shí)說(shuō)的函數(shù)調(diào)用或中斷入棧等等都是指的這里編譯器分配的棧。
好,現(xiàn)在我們回到剛剛的出現(xiàn)問(wèn)題的代碼上來(lái),然后我們看看怎么解決,由于分析出是棧不夠的情況,所以我們就可以通過(guò)其他兩種方式解決:
1、改變變量數(shù)組類型:全局或靜態(tài)的,這樣由編譯器分配內(nèi)存
2、使用malloc動(dòng)態(tài)分配空間:由于malloc不占用棧區(qū),所以也可以我們先改為全局變量試試
評(píng)論