【 聲明:版權所有,歡迎轉載,請勿用於商業用途。 聯系信箱:feixiaoxing @163.com】
內存是程序運行的基礎。所有正在運行的代碼都保存在內存裡面。內存需要處理各種各樣的數據,包括鍵盤的數據、鼠標的數據、usb的數據、串口的數據、攝像頭的數據,那麼這些數據經過程序的處理之後,就要進行輸出到串口、屏幕、usb等。
內存只有一個,但是程序裡面的空間有很多種。但是內存中的數據類型只有幾種,比如說全局中的數據、堆中的數據、臨時堆棧中的數據。那麼他們有什麼區別呢?我們可以通過代碼發現一些問題。
(1)全局數據
static int value = 100;
void process()
{
static int number = 10;
}
static int value = 100;
void process()
{
static int number = 10;
} 大家可以在這裡看到,value和number的數據其實都屬於全局數據,這裡的變量是不隨著函數的調用發生變化的。
(2)堆數據
void process()
{
char* point = (char*)malloc(100);
free(point);
}
void process()
{
char* point = (char*)malloc(100);
free(point);
} 這裡的point分配的數據就是堆數據,如果沒有free操作,那麼它的存在也是全局的。只要內存不主動釋放,那麼這個內存就會以一直存在。
(3)臨時數據
void process()
{
char name[100] = {0};
return;
}
void process()
{
char name[100] = {0};
return;
} 這裡的數據都是堆棧內部的數據,一旦process調用結束返回之前,那麼name地址指向的內存空間已經被其他函數使用。此時這段內存空間對我們來說已經沒有什麼意義了。所以,不管在函數裡面用了多少空間,如果你想在函數返回之前繼續使用裡面的數據,務必在函數返回前拷貝完畢。
這篇博客的內容比較簡單,主要講述了內存的一些內容。其實關於內存的東西還很多。這裡說明一下只是讓大家有一個了解:
1) 全局數據是我們喜歡使用的類型,用起來比較方便
2)堆數據是系統給我們安排的空間
3)堆棧空間只能存在於當時的函數之中,函數返回即失去意義
雖然我們上面這麼說,但是這三個概念有的時候也是可以相互遷移的,比如說:
1) 有的時候,我們為了測試的需要,首先構建一個全局內存池,以後測試的內存都是通過自定義的malloc在內存池中分配的,所以這個時候,堆分配和全局聯系在了一起。
全局內存空間 < =========> 內存池 < =========> 本地空間分配
2) 如果我們使用的函數空間比較小,那麼所有的操作就可以在一個函數內部完成了,那麼這時候全局空間和臨時堆棧是不是一致的呢
全局空間 < =============> 本地堆棧
上面的說法有些繞,但是我們的目的只是想讓大家時刻明白:
a)必須時刻明白我們的數據在哪塊空間裡面
b)內存會不會越界
c)內存會不會洩露
d)內存訪問的數據是否依然有效
【預告: 下面的博客開始介紹線性空間的內容】