程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 一步一步寫算法(之內存)

一步一步寫算法(之內存)

編輯:關於C語言

 

【 聲明:版權所有,歡迎轉載,請勿用於商業用途。  聯系信箱: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)內存訪問的數據是否依然有效

 

   

 

【預告: 下面的博客開始介紹線性空間的內容】

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved