關於 靜態陣列和new分配的動態陣列的區別

2021-06-25 11:36:13 字數 967 閱讀 3094

(1)

對靜態陣列名進行sizeof運算時,結果是整個陣列占用空間的大小;

因此可以用sizeof(陣列名)/sizeof(*陣列名)來獲取陣列的長度。

int a[5];則sizeof(a)=20,sizeof(*a)=4.因為整個陣列共佔20位元組,首個元素(int型)佔4位元組。

int *a=newint[4];則sizeof(a)=sizeof(*a)=4,因為位址位數為4位元組,int型也佔4位元組。

(2)但是靜態陣列作為函式引數時,在函式內對陣列名進行sizeof運算,結果為4,因為此時陣列名代表的指標即乙個位址,占用4個位元組的記憶體(因為在傳遞陣列名的引數時,編譯器對陣列的長度不做檢查,具體參見博文陣列的引用)。(當靜態陣列名作為形參傳入乙個函式後,該陣列名將只代表乙個指標,不再具備陣列名的意義;陣列名和指標的區別還在於陣列名是const的位址,無法像指標那樣進行p++,p--等操作,詳見「陣列名和指標的區別」)。對動態陣列的函式名,無論何時進行sizeof運算,得到的結果都是4.

(3)new還需要你delete,是在堆分配空間,效率較低;而直接在棧上分配,會自動釋放,效率高,但是棧空間有限。

(4)通過函式返回乙個陣列的問題

函式宣告的靜態陣列不可能通過函式返回,因為生存期的問題,函式呼叫完其內部變數占用的記憶體就被釋放了。

如果想通過函式返回乙個陣列,可以在函式中用new動態建立該陣列,然後返回其首位址。

其原因可以這樣理解,因為靜態陣列是在棧中申請的,而函式中的區域性變數也是在棧中的,而new動態陣列是在堆中的分配的,所以函式返回後,棧中的東西被自動釋放,而堆中的東西如果沒有delete不會自動釋放。

例子:int *test(int *b) //b可以是靜態陣列的陣列名,也可以是動態陣列的首位址

{ for(inti=0;i<5;i++) //輸出傳入的陣列各元素

cout<<*(b+i)<<"";

cout<

陣列的靜態分配和動態分配

原貼 1 在使用陣列前用new表示式動態分配陣列空間,new表示式在堆中分配空間,但是new之後還需delete,比較麻煩,初學者比較容易忘記,效率較低 而陣列的靜態分配,也就是在陣列宣告時直接在 中指定陣列的長度這種方式的記憶體實在棧上分配,在結束生命週期後自動釋放,效率相對較高,但是棧空間有限。...

靜態分配和動態分配

記憶體的靜態分配和動態分配的區別主要是兩個 一是時間不同。靜態分配發生在程式編譯和連線的時候。動態分配則發生在程式調入和執行的時候。二是空間不同。堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式 靜態分配和動態分配。靜態分配是編譯器完成的,比如區域性變數的分配。動態分配由函式malloc進行分配...

靜態儲存分配和動態儲存分配

通常定義變數或者物件,編譯器在編譯時都可以根據該變數或物件的型別知道所需記憶體空間的大小,從而系統在適當的時候為他們分配確定的儲存空間,這種記憶體分配被稱為靜態儲存分配。有些操作物件只有在程式執行時才能確定,這樣編譯器在編譯時就無法為他們預定儲存空間,只能在程式執行時,系統根據執行時的要求進行記憶體...