C語言動態記憶體分配

2022-08-11 06:45:08 字數 2352 閱讀 3566

c語言動態記憶體分配:堆不連續 棧連續

動態記憶體分配:

1.從靜態儲存區域中分配(系統自己分配)

2.從堆記憶體中分配(動態記憶體分配)

3.在棧中進行分配(系統自己分配)

動態記憶體分配和釋放函式:

malloc函式

calloc函式

recalloc函式

free函式

常見記憶體分配錯誤:

使用未分配的記憶體

引用了分配成功但尚未初始化的記憶體

記憶體分配且初始化了,但進行了越界操作

忘記釋放記憶體,造成記憶體洩露

釋放記憶體之後,繼續去使用這一記憶體 

free之後,繼續使用指標,野指標

1.記憶體分配方式:

1.1在靜態儲存區中進行分配

內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數

1.2在棧中進行分配

在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時,這些儲存但願自動被釋放。效率很高,但是分配的記憶體容量比較有限

1.3在堆中進行分配

在堆上分配也稱為動態記憶體分配:程式在執行的時候用malloc等函式申請任意多少的記憶體,程式設計師自己負責在何時用free釋放記憶體。動態記憶體分配的生存期由我們自己決定,使用非常靈活,但是問題相對也比較多;注意://如果沒有釋放的話,很容易就會造成記憶體溢位,因為堆中的記憶體塊是全域性的,因此不會因為函式的呼叫而結束。

2.幾個記憶體分配函式

2.1malloc函式 標頭檔案malloc.h 

void *malloc(size_t size) //————–>返回的是乙個通用型別的指標,根據需要去進行強轉; 

功能:允許從空閒記憶體池中分配連續記憶體但不初始化 

引數:size引數實際就是乙個所需位元組數的整數 malloc(20); 

返回:若分配成功則返回乙個指向該記憶體塊的指標,在使用時可根據需要做強制型別轉換,否則返回null(空指標)//需要判空 

free(p);//釋放記憶體空間,將記憶體釋放出來給系統; 

free函式與malloc函式是成對出現的; 

申請malloc的時候盡量去給它進行一下初始化,防止後面出現一些不確定性的東西; 

malloc的生命週期:只要沒有呼叫free這個函式,程序沒有結束,那麼此時,這個函式的生命週期就會一直存在在記憶體中;它是存放在堆空間中的,它不會因為你去函式呼叫的結束自動去釋放,堆當中的記憶體是全域性的。

如:int p = (int )malloc(n*sizeof(int)); //在空閒記憶體池中分配連續記憶體n*sizeof(int)個位元組的堆記憶體空間

2.4free函式 

free之後如果還有這塊記憶體位址的話,此時這塊記憶體歸還給了系統,(可能這塊記憶體還處於乙個空閒狀態)但是還是可以對其進行操作。裡面的值短暫的會保留。 

free之後,申請記憶體的那個指標就會變成野指標(宣告了,但是沒有任何指向的指標),有時候會出現野指標錯誤; 

所以盡量在操作之後:將指標置為null 

p=null; 

注意:申請和釋放是成對的,所以程式是不能進行多次free的,否則會崩潰的

1:段錯誤 

使用未分配成功的記憶體 

避免方式:在使用記憶體之前檢查指標是否為null; 

引用分配成功但尚未初始化的記憶體 

避免方式:賦予初值,即便是賦予零值也不可省略 

記憶體分配成功並且已經初始化,但操作越過了記憶體的邊界 

避免:注意下表的使用不能超出邊界 

忘記釋放記憶體,造成記憶體洩露 

避免方式:申請記憶體的方式和釋放記憶體的方式需要成雙成對 

釋放記憶體之後卻繼續去使用這一塊記憶體 

避免方式:使用free記憶體之後,把指標置為null;

記憶體錯誤的注意點: 

指標消亡了,並不表示它所指向的記憶體會被自動釋放,(在free之前,直接將指標設為null); 

記憶體釋放了,並不代表指標會消亡或者成了null指標;(在free之後,指標並沒有進行null設定)

野指標: 

野指標的形成是指標變數沒有被初始化,任何指標變數剛被建立的時候不會自動成為null指標,它的預設值是最忌的,它會亂指一氣

指標變數在建立的同時應當被初始化,要麼將指標設定為null,要麼讓它指向合法記憶體

free記憶體塊之後,需要將指標設定為null,如果沒有設定為null,也會出現「野指標」,它是指向「垃圾」記憶體的指標;

多次free記憶體塊,是會導致程式崩潰的

c語言動態記憶體分配 C 動態記憶體分配

動態記憶體分配 雖然通過陣列就可以對大量的資料和物件進行有效地管理,但是很多情況下,在程式執行之前,我們並不能確切地知道陣列中會有多少個元素。這種情況下,如果陣列宣告過大,就會造成浪費 宣告過小,就會影響處理。在c 中,動態記憶體分配技術可以保證程式在執行過程中按照需要申請適量記憶體,使用後釋放,從...

C語言動態記憶體分配

c語言動態記憶體分配 動態資料結構可以在執行時靈活新增 刪除或重排資料項。在執行時分配記憶體空間的過程稱為動態記憶體分配。記憶體分配函式如下 malloc 分配所需的位元組大小,並返回指向所分配空間的第乙個位元組的指標 calloc 為元素陣列分配空間,並初始化為零,然後返回指向該記憶體的指標 fr...

C語言 動態記憶體分配

c語言有儲存變數的區域稱之為棧 stack 除此之外 c語言還允許建立自己的動態記憶體區域 以存放一些臨時的資料 這區域稱之為 堆 heap 也就是存放執行時的資料 可以根據程式的需要 向系統申請所需大小的空間 由於未宣告部分定義他們為變數或者陣列因此只能通過指標去訪問 建立記憶體動態分配主要由4個...