談談C語言中的變數型別以及記憶體管理

2021-10-06 14:58:15 字數 1499 閱讀 8130

1.生命週期

指的是變數值保留的期限。按照生命週期,可將變數分為兩類:靜態變數和動態變數。

靜態變數:靜態變數儲存在記憶體中的靜態儲存區,在編譯的時候就分配了儲存空間,在整個程式執行期間,該變數占有固定的記憶體單元,變數的值都始終存在,直到程式結束後,這部分空間才釋放出來。因此,靜態變數的生命週期為整個程式執行的時間。

動態變數:動態變數儲存在記憶體的動態儲存區,在程式執行過程中·,只有當變數所有函式被呼叫時,編譯系統才會臨時為該變數分配一段記憶體單元,該變數才有值,函式呼叫結束,變數值立即消失,這部分空間釋放。因此,動態變數的生命週期僅在函式呼叫期間。

在c語言中,具有靜態儲存性質的變數:外部變數、靜態全域性變數、靜態區域性變數。

在c語言中,具有動態儲存性質的變數:自動變數(auto)、暫存器變數(register)。

2.作用域

指的是變數的有效範圍,可將變數分為兩種:區域性變數和全域性變數。

區域性變數:在乙個函式或復合語句內定義的變數,區域性變數僅在定義它的函式或復合語句內有效。

全域性變數:定義在所有函式之外的變數,作用範圍是從定義開始,直到程式的結束。

·在c語言中,區域性變數有:自動變數、暫存器變數和內部靜態變數。

·在c語言中,全域性變數有:外部變數、外部靜態變數。

3.變數

c語言的變數有:自動變數、暫存器變數、外部變數、靜態內部變數和靜態外部變數

一般來說,我們可以將記憶體分為三個部分:靜態區、棧、堆。

靜態區:儲存自動全域性變數和static變數。靜態區的內容在整個程式的生命週期內都存在,由編譯器在編譯的時候分配。

棧:儲存區域性變數。棧上的內容只在函式範圍內存在,也就是說,當函式執行結束的時候,這些內容也會自動銷毀。

堆:由malloc系列函式或new操作符分配的記憶體。其生命週期由free或delete決定。在沒有釋放之前一直存在,直到程式結束。

1.緩衝區溢位問題

電腦程式一般都會使用到一些記憶體,這些記憶體或是程式內部使用,或是存放使用者的輸入資料,這樣的記憶體一般稱作緩衝區。溢位是指盛放的東西超出容器容量而溢位來了,在電腦程式中,就是資料使用到了被分配記憶體空間之外的記憶體空間。而緩衝區溢位,簡單的說就是計算機對接收的輸入資料沒有進行有效的檢測(理想的情況是程式檢查資料長度並不允許輸入超過緩衝區長度的字元),向緩衝區內填充資料時超過了緩衝區本身的容量,而導致資料溢位到被分配空間之外的記憶體空間,使得溢位的資料覆蓋了其他記憶體空間的資料。

言簡意涵,緩衝區溢位可以換一種說法,叫做儲存資料的某一部分記憶體溢位,而記憶體的範圍就是我們上面說到的靜態區、棧和堆,也就是說緩衝區溢位包含了溢位問題這一大類,即我們上面所說的靜態區越界,棧越界,堆越界。

從記憶體理解c語言中變數的儲存型別

今晚看了一下linux程式設計,看到了程序管理這一塊,講解了c語言中的各種變數的儲存型別,而且是從程序 記憶體的角度講解的,以前從沒有這樣理解過,覺得挺有用的,在這裡記錄下來。首先要來理解一下可執行檔案載入進記憶體後形成的程序在記憶體中的結構,如下圖 區 存放cpu執行的機器指令,區是可共享,並且是...

C語言中變數的儲存型別

變數的儲存型別 storage class 是指儲存變數值的記憶體型別。有三個地方可以用於儲存變數 普通記憶體 執行時堆疊 硬體暫存器 用於宣告變數儲存型別的關鍵字 auto static register 在所有 塊之外的變數的預設儲存型別是靜態的 static 儲存於靜態記憶體中,稱為靜態 st...

c語言中register型別的變數

關鍵字regiter請求編譯器盡可能的將變數存在cpu的暫存器中。有以下幾點注意的地方。register變數必須是能被cpu暫存器所接受的型別,這通常意味著register變數必須是乙個單個的值,並且其長度應小於或等於整型的長度。但是,有些機器的暫存器也能存放浮點數。register變數可能不存放在...