變量、參數和內存分配

變量、參數和內存分配數組

 

目錄app

  • 變量的類型
  • 參數的類型
  • 變量和參數的區別
  • 內存的靜態分配和動態分配
  • 棧機制——運行時內存佈局(Runtime Memory Layout)
  • 初始化

 

變量的類型函數

按做用範圍分類佈局

能夠把變量分爲局部變量和全局變量spa

按變量的存儲類型操作系統

自動存儲類型(默認)線程

自動存儲類型修飾符指定了一個局部變量爲自動的,這意味着,每次執行到定義該變量的語句塊時,都將會爲該變量在內存中產生一個新的拷貝,並對其進行初始化指針

靜態存儲變量 code

外部存儲類型索引

寄存器存儲類型

 

參數的類型

實參和形參

 

變量和參數的區別

參數表示一個值,過程但願您在調用它時傳遞該值。過程的聲明定義其參數.
變量表示在您調用過程時傳遞給過程參數的那個值。調用代碼在它調用過程時提供此變量.

 

內存的靜態分配和動態分配 

要弄懂這個問題,首先你得知道靜態和動態指的是什麼。我的以爲卡耐基上的解釋很經典:

     「The word static refers to things that happen at compile time and link time when the program is constructed—as opposed to load time or run time when the program is actually started.」

     「The term dynamic refers to things that take place when a program is loaded and executed. 」

說白了,內存的靜態分配和動態分配的區別主要是兩個:

一是時間不一樣。靜態分配發生在程序編譯和鏈接的時候。動態分配則發生在程序調入和執行的時候。

二是空間不一樣。堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,好比局部變量的分配。動態分配由函數malloc進行分配。不過棧的動態分配和堆不一樣,他的動態分配是由編譯器進行釋放,無需咱們手工實現。     

對於一個進程的內存空間而言,能夠在邏輯上分紅3個部份:代碼區,靜態數據區和動態數據區。動態數據區通常就是「堆棧」。「棧(stack)」和「堆(heap)」是兩種不一樣的動態數據區,棧是一種線性結構,堆是一種鏈式結構。進程的每一個線程都有私有的「棧」,因此每一個線程雖然代碼同樣,但本地變量的數據都是互不干擾。一個堆棧能夠經過「基地址」和「棧頂」地址來描述。全局變量和靜態變量分配在靜態數據區,本地變量分配在動態數據區,即堆棧中。程序經過堆棧的基地址和偏移量來訪問本地變量。

通常,用static修飾的變量,全局變量位於靜態數據區。函數調用過程當中的參數,返回地址,EBP和局部變量都採用棧的方式存放。

其它: 

所謂動態內存分配就是指在程序執行的過程當中動態地分配或者回收存儲空間的分配內存的方法。動態內存分配不象數組等靜態內存分配方法那樣須要預先分配存儲空間,而是由系統根據程序的須要即時分配,且分配的大小就是程序要求的大小。

例如咱們定義一個float型數組:float score[100];    

可是,在使用數組的時候,總有一個問題困擾着咱們:數組應該有多大?在不少的狀況下,你並不能肯定要使用多大的數組,好比上例,你可能並不知道咱們要定義的這個數組到底有多大,那麼你就要把數組定義得足夠大。這樣,你的程序在運行時就申請了固定大小的你認爲足夠大的內存空間。即便你知道你想利用的空間大小,可是若是由於某種特殊緣由空間利用的大小有增長或者減小,你又必須從新去修改程序,擴大數組的存儲範圍。這種分配固定大小的內存分配方法稱之爲靜態內存分配。可是這種內存分配的方法存在比較嚴重的缺陷,特別是處理某些問題時:在大多數狀況下會浪費大量的內存空間,在少數狀況下,當你定義的數組不夠大時,可能引發下標越界錯誤,甚至致使嚴重後果。

咱們用動態內存分配就能夠解決上面的問題. 所謂動態內存分配就是指在程序執行的過程當中動態地分配或者回收存儲空間的分配內存的方法。動態內存分配不象數組等靜態內存分配方法那樣須要預先分配存儲空間,而是由系統根據程序的須要即時分配,且分配的大小就是程序要求的大小。從以上動、靜態內存分配比較能夠知道動態內存分配相對於景泰內存分配的特色:

   一、不須要預先分配存儲空間;

   二、分配的空間能夠根據程序的須要擴大或縮小。 

要實現根據程序的須要動態分配存儲空間,就必須用到malloc函數. 

malloc函數的原型爲:void *malloc (unsigned int size) 其做用是在內存的動態存儲區中分配一個長度爲size的連續空間。其參數是一個無符號整形數,返回值是一個指向所分配的連續存儲域的起始地址的指針。還有一點必須注意的是,當函數未能成功分配存儲空間(如內存不足)就會返回一個NULL指針。因此在調用該函數時應該檢測返回值是否爲NULL並執行相應的操做。

 

棧機制——運行時內存佈局(Runtime Memory Layout)

一個程序要運行,就要先將可執行文件裝載到計算機內存中。裝載是操做系統掌控的,通常而言,操做系統將程序裝入內存後,將造成一個隨時能夠運行的進程空間,該進程空間分四個區域,由上到下爲:代碼區(code area)、全局數據區(data area)、堆區(heap area)、棧區(stack area);一個運行的程序在內存中表示爲這四個空間區域,其中代碼區存放程序的執行代碼。所謂執行代碼就是索引了一個個函數塊代碼,它由函數定義塊的編譯獲得;全局數據區存放全局數據、常量、文字量、靜態全局量和靜態局部量;堆區存放動態內存,供程序隨機申請試用;棧區存放函數數據區(即局部數據區),它動態地反映了程序運行中的函數狀態,其運動軌跡正好用來觀察函數的調用和返回,從而研究其函數機制。

 

初始化

在不進行顯式初始化的狀況下,外部變量和靜態變量都將被初始化爲0,而自動變量和寄存器的初值則沒有定義(即初值爲無用的信息)

對於外部變量與靜態變量來講,初始化表達式必須是常量表達式,且只初始化一次(從概念上講在程序開始執行前進行初始化);對於自動變量和寄存器變量,則在每次進入函數或程序塊時都將被初始化

建議使用顯示的賦值語句,如int low = 0;而不是int low; low = 0;

字符數組的初始化比較特殊:能夠用一個字符串來代替用花括號括起來並用逗號分隔的初始化表達式序列,如char pattern[] = "ould";  //數組的長度是5,加上一個'\0'爲字符串結束符

相關文章
相關標籤/搜索