指標和記憶體分配乙個最基本理解

2021-07-03 18:28:11 字數 1148 閱讀 1328

乙個典型的c程式主要由預處理命令 #include + 主函式main()+ function  a()+  function b()+….

c語言中的5類語句:declaration + assignment + function + control + null

在c語言中,所有變數在使用前都必須定義。

一維陣列名:

一維陣列名是個指標常量,它存放的是一維陣列第乙個元素的位址。

乙個指標變數,無論它指向的變數佔幾個位元組,它本身佔4個位元組,乙個變數的位址是用其首位元組的位址來表示的。

傳統陣列的缺點:

1、傳統陣列的長度要確定,且必須為長整數。

2、陣列所佔的記憶體,程式設計師無法手動的釋放。只能在本函式執行完畢後,系統自動釋放。

3、陣列的長度一旦定義,其長度就不能更改。

4、a函式定義的陣列,在a函式執行期間可以被其它函式使用。但a函式執行完畢之後,a函式中的陣列就無法被其他函式使用。即:陣列不能跨函式使用。

int * p = (int*)malloc(4) 中:

1、要使用malloc函式,需要新增標頭檔案malloc.h標頭檔案

2、malloc函式只有乙個形參,且是整形

3、4表示請求系統為本程式分配4個位元組

4、malloc函式只能返回第乙個位元組的位址。

(int *)表示強制型別轉換!該語句分配了8個位元組,p變數佔4個位元組,p所指向的記憶體也佔4個位元組。p本身所佔記憶體是靜態分配的,p所指向的記憶體是動態分配的。free(p)是把p所指向的記憶體釋放了,而p本身的記憶體是函式執行結束後,由系統自動釋放的。

p變數只有是指標變數的時候才能在前面加*,若p變數是其他的普通變數,則一定不能加*!

記憶體分配:

動態記憶體是在堆中分配的,由程式設計師動態的申請和手動的釋放。靜態記憶體是在棧中分配的,由系統自動分配和系統自動釋放。main函式在呼叫某個函式(比如f()函式)時,先將f函式的內容和所需引數壓棧,如果f函式要呼叫g函式,則把g函式的內容和所需引數壓棧,以此類推。等呼叫完g函式之後,就會把g函式出棧,釋放g函式所佔記憶體,然後繼續執行f函式,f函式執行完後,把f函式出棧,釋放f函式所佔記憶體,最後執行main函式,等main函式全部執行完後,程式執行完了,就釋放程式所佔的全部記憶體。所以動態分配記憶體可以跨函式使用,因為不存在進棧和出棧,而靜態分配記憶體在函式執行完後就出棧,釋放記憶體,所以不能跨函式使用。

乙個快速的記憶體分配池

對於現代的遊戲引擎來說,為了提高效能和有效的管理記憶體,需要使用各種各樣的記憶體分配模型,記憶體池作為一種有效的分配模型被大量的使用,它通過一次分配足夠的記憶體來減少對new delelte使用以提高引擎的效能,並且由於每乙個記憶體塊都有相同的大小因此非常易於管理,並可以防止記憶體的洩露。它通常被用...

乙個簡單的記憶體分配演算法

果然不到50行,果然可以在2小時上機寫完,管然面試讓15分鐘寫出來不過分 const int seg len 128 4 struct mem seg struct mem list mem seg head mem seg end mem list mem init char all mem,in...

記憶體分配的乙個簡單思路

好吧好吧,又開始作,打算碰一下,據說n年都學不好的西加加 誰給你的勇氣?然後就看到了一段小 覺得思路不錯,沒啥新鮮的,只是學c的時候,貌似居然沒有碰到過,其實是乙個很常識的思路。one super simle program about memory allocation.good way to a...