指標的強制型別轉換和動態分配記憶體

2021-07-09 04:59:16 字數 943 閱讀 4317

c裡面使用自動分配記憶體,比如說malloc分配自由訪問區,就把它當作是在堆上分配的了,

他的好處是可分配的記憶體更大更靈活,理論上可以分配使用者空間能使用的所有虛擬記憶體空間,

它是通過鏈式分配的,比如說有這樣的乙個語句 :

int *p=(int *)malloc(sizeof(int))

意思是,先在棧上建立乙個int型別的指標變數,再在堆上分配4個位元組大小的空間<32位》,再把建立的記憶體首位址賦給p。

在上面這個題目中,p是在棧上分配的,就是所謂的自動動分配,最多能分配的好象是1m空間的大小,有的說是2m。正因為在堆上 分配的它不可以自動**記憶體,所以要顯試的呼叫free()來收回記憶體,還有就是如果p是區域性變數的時候,一定要在p的作用域內呼叫free(),因為p 是在棧上分配的,一但清棧之後p的作用域沒了,這個時候你要是想在其他地方呼叫free就沒效果了,這個就象鍊錶的頭指標丟失 。

當你學c++的時候,研究一下new和malloc吧

(int*)意思是把後面的資料強制型別轉換成整型的指標型別。

malloc(sizeof(int))在堆上開闢乙個4個位元組的儲存空間,並返回空間的首位址。

手動分配記憶體的好處是可以實現記憶體的動態分配和**。 

因為如果使用靜態分配,在編寫程式時,很難**變數使用量。比如說鍊錶等資料結構,很難在編寫程式時知道鍊錶的長度,所以靜態分配記憶體要麼浪費資源,要麼分配的不夠。在使用某些遞迴演算法時,更需要手動分配記憶體,否則就會像狗熊掰棒子一樣只剩下最後乙個了。 

手動分配記憶體一定要注意**。否則就會造成記憶體洩露

靜態分配是自動的

存在棧上的資料是靜態分配的 存在堆上的資料是動態分配的,堆是自由儲存區。

棧是先進後出(filo)適合用於靜態分配,計算機用來自動分配。

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

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

函式指標的強制型別轉換

先給出結論 函式指標是可以通過強制型別轉換而指向具有不同函式簽名的函式的,但是,轉換後,該函式指標沒辦法正確呼叫所指向的函式 不能給函式傳遞引數。下文給出得出這個結論的小故事。前幾天的任務要求寫乙個logger類,該類對外提供一些靜態的方法,但不生成物件。該類的主要作用是用來輸出訊息,不同的是可以由...

指標強制型別轉換的理解

指標強制型別轉換的理解 一些用到的 開始之前,先來複習一些會用到的知識。1.位址,位元組,位 位 bit 是電子計算機中最小的資料單位。每一位的狀態只能是0或1。位元組 byte 是用於計量儲存容量的一種單位,每乙個位元組由8位組成 1byte 8bit 位址可以理解為在一片記憶體中,每個位元組 b...