內存是程序運行的基礎。所有正在運行的代碼都保存在內存裏面。內存需要處理各種各樣的數據,包括鍵盤的數據、鼠標的數據、usb的數據、串口的數據、攝像頭的數據,那麼這些數據經過程序的處理之後,就要進行輸出到串口、屏幕、usb等。
內存只有一個,但是程序裏面的空間有很多種。但是內存中的數據類型只有幾種,比如說全局中的數據、堆中的數據、臨時堆棧中的數據。那麼他們有什麼區別呢?我們可以通過代碼發現一些問題。
(1)全局數據
- static int value = 100;
- void process()
- {
- static int number = 10;
- }
(2)堆數據
- void process()
- {
- char* point = (char*)malloc(100);
- free(point);
- }
(3)臨時數據
- void process()
- {
- char name[100] = {0};
- return;
- }
這篇博客的內容比較簡單,主要講述了內存的一些內容。其實關於內存的東西還很多。這裏說明一下只是讓大家有一個瞭解:
1) 全局數據是我們喜歡使用的類型,用起來比較方便
2)堆數據是系統給我們安排的空間
3)堆棧空間只能存在於當時的函數之中,函數返回即失去意義
雖然我們上面這麼說,但是這三個概念有的時候也是可以相互遷移的,比如說:
1) 有的時候,我們爲了測試的需要,首先構建一個全局內存池,以後測試的內存都是通過自定義的malloc在內存池中分配的,所以這個時候,堆分配和全局聯繫在了一起。
全局內存空間 < =========> 內存池 < =========> 本地空間分配
2) 如果我們使用的函數空間比較小,那麼所有的操作就可以在一個函數內部完成了,那麼這時候全局空間和臨時堆棧是不是一致的呢
全局空間 < =============> 本地堆棧
上面的說法有些繞,但是我們的目的只是想讓大家時刻明白:
a)必須時刻明白我們的數據在哪塊空間裏面
b)內存會不會越界
c)內存會不會泄露
d)內存訪問的數據是否依然有效