二 記憶體分配

2022-05-18 20:49:11 字數 1772 閱讀 2777

c語言中描述變數的時候常用的兩個用語

1.作用域:也叫可見域,指的是變數的作用範圍。在哪個範圍內,該變數是可見的、可以使用的。

2.生存期:也叫儲存期,指的是變數從建立到銷毀的生存時間段。

作用域和存在域是兩個不同的概念,比如在程式的某個位置,某變數存在(記憶體中分配了位址)但不可見(不可使用)。

從作用域看,變數分為以下三種:

1.全域性變數

在c語言中,把在任何函式之外宣告的變數稱為全域性變數。一般情況下,全域性變數在任何地方都是可見的。當然也有例外,比如在語句塊{}內宣告了乙個同名的區域性變數,則該全域性變數會暫時不可見。

//

全域性變數

int foo = 5

;void

fun()

intmain()

->foo...%d\n

", foo);

//區域性變數,遮蔽同名區域性變數bar

int bar = 4

; printf(

"{}->bar...%d\n

", bar);

}fun();

return0;

}

2.檔案內部的靜態變數

這就是上文中說的靜態的全域性變數。

3.區域性變數

在函式中,或更直接的說是在語句塊{}內定義的變數,是區域性變數。它的可見域僅限於語句塊內,在其它地方無法引用。區域性變數在函式被呼叫時由系統分配儲存區,在不同的函式中同名的變數實際上在記憶體中佔不同的單元,因此在不同的函式中可以定義相同名字的區域性變數。如函式的形參,main函式中定義的變數都是區域性變數。

對作用域進行總結

c語言中存在三種作用域

(1)塊作用域

自動變數(auto、register)和內部靜態變數(static)具有塊作用域,在乙個塊內宣告的變數,其作用域從宣告點開始,到該塊結束為止。函式定義中宣告的形參,其作用域限定在該函式體內,與其他函式中宣告的同名變數不是一回事,允許在不同的函式中使用相同的變數名,編譯器將為這些變數分配不同的儲存單元,不會衝突。

(2)檔案作用域

外部靜態變數(static)具有檔案作用域,從宣告點開始到檔案末尾,此處所指的檔案是編譯基本單位—c檔案。

(3)全域性(程式)作用域

全域性變數(extern)具有全域性作用域,只要在使用前對其進行宣告,便可在程式(由若干個檔案組成)的任意位置使用全域性變數

從生存期看,分為以下三種:

1.靜態變數(static variable)

全域性變數和指定static的區域性變數,都具有靜態儲存期。它們從程式開始一直到程式結束都存在,故被統稱為靜態變數。

2.自動變數(auto variable)

沒有被指定為static的區域性變數和暫存器變數(register variable)都是自動變數。函式的形參及**塊中定義的變數都屬於auto變數,這是c語言中應用最廣的一種變數,這類變數是棧分配的,是動態分配儲存空間的。舉函式形參為例,當呼叫該函式時,為形參分配儲存空間,當函式呼叫結束時,就自動釋放這些儲存空間。對**塊中定義的變數(包含函式中定義的變數),當執行到變數宣告語句時,系統為這些auto變數分配空間,當程式流程離開**塊時,這些變數被自動撤銷,其占用的記憶體空間被釋放。

3.堆變數

通過malloc()函式分配記憶體區域的變數被放在堆中,故稱為堆變數。並且似乎這個「堆」和資料結構中的堆沒有什麼聯絡,只是一種稱呼而已。這種變數需要手動釋放記憶體區域:free(變數名),也就是說它從建立時起就一直存在直到使用free()釋放為止。當然,即使最後忘了釋放,如今的作業系統也會在程式結束後釋放為它分配的記憶體。不過仍然建議:誰建立,誰釋放。

CUDA 二 記憶體分配函式

除了前面提到的記憶體分配函式cudamalloc之外,這裡再簡單的介紹幾個常用的記憶體分配函式 cudamallocpitch cudamalloc3d等。cudaerror t cudamallocpitch void devptr,size t pitch,size t width,size t...

記憶體分配 Go記憶體管理 記憶體分配一

go作為乙個比較新晚 新 的語言,自然借鑑前輩們的優點,比如說語言本身負責記憶體管理 對協程和高併發的高優支援 簡單高效的語法等。本篇及後續的幾篇要講的就是還沒提到的比較複雜的記憶體管理。學習記憶體管理 分配 前,如果有jvm的記憶體管理的基礎,會變得非常簡單,如果是第一次接觸記憶體管理,在看完go...

隨堂筆記(二) 記憶體分配函式

malloc 函式就是在記憶體中找一片指定大小的空間,然後將這個空間的首位址範圍給乙個指標變數,這裡的指標變數可以是乙個單獨的指標,也可以是乙個陣列的首位址,這要看malloc 函式中引數size的具體內容。void cdecl malloc in size t size 函式原型 int p in...