內建陣列大小分配的問題

2021-08-21 03:16:29 字數 1404 閱讀 3917

動態記憶體分配相對於靜態記憶體分配的特點:

1) 靜態記憶體分配是在編譯時完成的,不需要占用cpu資源;動態分配記憶體是在執行時完成的,動態記憶體的分配與釋放需要占用cpu資源;

2) 靜態記憶體分配是在棧上分配的,動態記憶體是堆上分配的;

3) 動態記憶體分配需要指標或引用資料型別的支援,而靜態記憶體分配不需要;

4) 靜態分配記憶體需要在編譯前確定記憶體塊的大小,而動態分配記憶體不需要編譯前確定記憶體大小,根據執行時環境確定需要的記憶體塊大小,按照需要分配記憶體即可。可以這麼說,靜態記憶體分配是按計畫分配,而動態記憶體分配是按需分配。

5) 靜態分配記憶體是把記憶體的控制權交給了編譯器,而動態記憶體是把記憶體的控制權交給了程式設計師

動態分配記憶體具體的實現方法(兩種)

在c語言的實現的方法:

(1)動態記憶體分配的實現及管理

要實現動態記憶體分配需要分配動態空間函式malloc函式。該函式的原型為:

void* malloc(unsigned int size);

其作用是在堆記憶體中分配乙個長度為size的連續空間。返回值是乙個指向所分配的連續儲存域的起止位址的指標。分配乙個堆記憶體是有風險的,如果堆記憶體空間不足時,該函式就會返回乙個null指標,所以在呼叫該函式後應該檢測返回值是否為null並執行相應的操作。

如: char* str = malloc(4*sizeof(char));

if(str != null) …..;

(2)動態記憶體的釋放

由於堆記憶體的使用空間是有限的,當使用該指標結束後,就應該釋放該空間的記憶體,以便其他的變數使用它。這就需要free函式。其函式原型是:

void free(void* p);

作用是釋放指標p所指向的記憶體空間。指標p必須是指向malloc分配的空間,如果不是堆空間,那麼會造成可怕的後果。

列如:char* p1,*p2;

p1 = malloc(3*sizeof(char));

p2 = p1;

free(p2);

以上操作是正確的。

(3)野指標

由於動態記憶體分配的堆記憶體已經釋放,該記憶體內的原變數已將不存在,但是該指標仍然指向這一堆記憶體的位址,由於不知道該堆記憶體不知道會儲存什麼記憶體,因此該指標被稱為「野指標」。

消除野指標的方法是把該指標置為null。

p2 = null;

在c++中的實現方法:

(1)用指標建立堆空間

在c++中使用關鍵字new建立乙個堆並分配記憶體。

int * p = new int;

(2)用指標刪除堆中的空間

由於使用new建立的記憶體空間不會被系統自動釋放,如果程式設計師不去釋放,那麼會導致記憶體洩露。

delete p;

(3)野指標

p=null;

runaway 關於檢視棧的分配大小問題

我們知道一些區域性變數的儲存是通過棧來實現的。但是我們在實際儲存當中,給每個資料儲存的空間到底是多少呢?這次以整型資料為例,展示一下如何檢視棧的分配。include include int recurse int x 這裡通過不斷的遞迴呼叫函式來檢視儲存的極限。int main int argc,c...

C 定義陣列大小問題

一般情況下vc 編譯的程式乙個執行緒的棧的大小預設為1m 其他的編譯器定義的棧大小也不會很大 定義陣列大小 比如 int a 1000 1000 的時候就會出錯,大小有1000 1000 4 3.8m,當然會發生棧溢位錯誤。解決的辦法很簡單,將這個大的陣列放到其他地方即可,比如可以將這個陣列放到靜態...

任意大小分配的記憶體池實現

最近在寫多 流方面的東西,發現要頻繁的分配記憶體,如果採用 new來分配速度會很慢,於是自己做了乙個記憶體池。但是如果要開發任意大小分配的記憶體池是非常困難的,而且不能保證有 new的速度快,在網上看到的記憶體池一般都是固定大小分配的。雖然任意大小分配的記憶體池很難實現,但是在某些特殊條件下,就變的...