內存

內存是程序運行的基礎。所有正在運行的代碼都保存在內存裏面。內存需要處理各種各樣的數據,包括鍵盤的數據、鼠標的數據、usb的數據、串口的數據、攝像頭的數據,那麼這些數據經過程序的處理之後,就要進行輸出到串口、屏幕、usb等。

    內存只有一個,但是程序裏面的空間有很多種。但是內存中的數據類型只有幾種,比如說全局中的數據、堆中的數據、臨時堆棧中的數據。那麼他們有什麼區別呢?我們可以通過代碼發現一些問題。

    (1)全局數據

  1. static int value = 100;  
  2.   
  3. void process()  
  4. {  
  5.     static int number = 10;  
  6. }  
    大家可以在這裏看到,value和number的數據其實都屬於全局數據,這裏的變量是不隨着函數的調用發生變化的。


    (2)堆數據

  1. void process()  
  2. {  
  3.     char* point = (char*)malloc(100);  
  4.     free(point);  
  5. }  
    這裏的point分配的數據就是堆數據,如果沒有free操作,那麼它的存在也是全局的。只要內存不主動釋放,那麼這個內存就會以一直存在。


    (3)臨時數據

  1. void process()  
  2. {  
  3.     char name[100] = {0};  
  4.     return;  
  5. }  
    這裏的數據都是堆棧內部的數據,一旦process調用結束返回之前,那麼name地址指向的內存空間已經被其他函數使用。此時這段內存空間對我們來說已經沒有什麼意義了。所以,不管在函數裏面用了多少空間,如果你想在函數返回之前繼續使用裏面的數據,務必在函數返回前拷貝完畢。

    這篇博客的內容比較簡單,主要講述了內存的一些內容。其實關於內存的東西還很多。這裏說明一下只是讓大家有一個瞭解:

    1) 全局數據是我們喜歡使用的類型,用起來比較方便

    2)堆數據是系統給我們安排的空間

    3)堆棧空間只能存在於當時的函數之中,函數返回即失去意義

    

    雖然我們上面這麼說,但是這三個概念有的時候也是可以相互遷移的,比如說:

    1) 有的時候,我們爲了測試的需要,首先構建一個全局內存池,以後測試的內存都是通過自定義的malloc在內存池中分配的,所以這個時候,堆分配和全局聯繫在了一起。

                全局內存空間          < =========>  內存池     < =========> 本地空間分配

    2) 如果我們使用的函數空間比較小,那麼所有的操作就可以在一個函數內部完成了,那麼這時候全局空間和臨時堆棧是不是一致的呢

               全局空間   < =============>  本地堆棧


    上面的說法有些繞,但是我們的目的只是想讓大家時刻明白:

    a)必須時刻明白我們的數據在哪塊空間裏面

    b)內存會不會越界

    c)內存會不會泄露

    d)內存訪問的數據是否依然有效

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章