關于上一篇文章提出的問題
程序要想運行的話,必須得把程序從rom或者Flash中拷貝到ram內存中,cpu從ram開始讀取程序,并執行。那么問題來了,程序在內存中是如何存在的,也就是說,程序在內存中有哪些分區,變量,常量······是如何分類并分布存在的?
從pc機上向單片機燒寫程序,一般是將程序燒寫到單片機內部的rom或者flash中,單片機想要運行該程序的話,需要將程序從rom或者flash中拷貝到ran內存中。程序在內存中主要分為下面幾個區域:
堆區:分配局部變量空間;
棧區:用于分配程序員申請的內存空間;
靜態區:分配靜態變量,全局變量空間;
只讀區:分配常量,程序代碼空間;
其它區:其它區域。
具體情況如下例所示:
main.cpp int a = 0; 全局初始化區 char *p1; 全局未初始化區 main() { int b; 棧 char s[] = "abc"; 棧 char *p2; 棧 char *p3 = "123456"; 123456/0在常量區,p3在棧上。 static int c =0; 全局(靜態)初始化區 p1 = (char *)malloc(10); 堆 p2 = (char *)malloc(20); 堆 }在C語言中堆棧是存在于哪里的概念,它們的作用和區別是什么?
我們先從大家比較熟悉的棧說起吧,它是一種具有后進先出性質的數據結構,也就是說后存放的先取,先存放的后取。這就如同我們要取出放在箱子里面底下的東西(放入的比較早的物體),我們首先要移開壓在它上面的物體(放入的比較晚的物體)。而堆就不同了,堆是一種經過排序的樹形數據結構,每個結點都有一個值。通常我們所說的堆的數據結構,是指二叉堆。堆的特點是根結點的值最小(或最大),且根結點的兩個子樹也是一個堆。由于堆的這個特性,常用來實現優先隊列,堆的存取是隨意,這就如同我們在圖書館的書架上取書,雖然書的擺放是有順序的,但是我們想取任意一本時不必像棧一樣,先取出前面所有的書,書架這種機制不同于箱子,我們可以直接取出我們想要的書。
然而我要說的重點并不在這,我要說的堆和棧并不是數據結構的堆和棧,之所以要說數據結構的堆和棧是為了和后面我要說的堆區和棧區區別開來,請大家一定要注意。
堆和棧的第一個區別就是申請方式不同:棧(英文名稱是stack)是系統自動分配空間的,例如我們定義一個 char a;系統會自動在棧上為其開辟空間。而堆(英文名稱是heap)則是程序員根據需要自己申請的空間,例如malloc(10);開辟十個字節的空間。由于棧上的空間是自動分配自動回收的,所以棧上的數據的生存周期只是在函數的運行過程中,運行后就釋放掉,不可以再訪問。而堆上的數據只要程序員不釋放空間,就一直可以訪問到,不過缺點是一旦忘記釋放會造成內存泄露。
以上對堆棧的理解來自于“51黑電子論壇”一網友的高見,具體見: 堆棧入門——堆和棧區別 http://www.51hei.com/bbs/dpj-37256-1.html (出處: 單片機論壇)
2017年03月06日,未完待續。
新聞熱點
疑難解答