今天看到乙個很有意思的函式——alloca,可以從棧裡動態分配記憶體,講講我對它的理解吧:
作用:這個函式的作用是可以從棧裡動態分配記憶體,如果函式a中的某個區域性變數在定義時並不知道它有多大,那麼就可以將需要使用的空間大小通過函式a的某個引數傳遞進來,在函式a內部使用alloca分配一塊棧記憶體,alloca函式返回的是這塊記憶體的首指標;不用擔心記憶體洩露問題,因為在函式a返回時,通過alloca申請的記憶體就會被自動釋放掉。
優點:這個函式的優點其實很明顯:
1、有了這個函式,如何定義某個不確定大小的區域性變數就變成了簡單的問題。其實關於這點,使用malloc函式也可實現,只不過需要程式設計師自己釋放不需要使用的記憶體,否則就記憶體洩露啦^_^
2、程式設計師只需要分配空間,釋放空間的事情由alloca函式提供的機制來完成
缺點:1、如果alloca函式導致棧溢位,程式的行為就undefined了,就是不確定、不可控了,很危險的乙個bug
2、可移植性很差,對編譯器和平台有很強的依賴性,在很多系統上的實現是有bug的,所以並不鼓勵使用。32v、pwb、pwb.2、3bsd、4bsd支援這個函式的實現,linux使用的是gun版本,在posix和susv3系統上是不支援該函式的
需要注意的是,很多系統上,alloca函式分配的記憶體不能被當做某個函式f的引數使用,因為分配到的記憶體塊會被當做引數儲存在函式f的棧中。還有在gnu版本下,alloca函式還有一些需要注意的地方,沒看懂。。。
雖然alloca函式不被推薦使用,但是在linux系統上,alloca函式卻是乙個非常好的用但沒有被人們認識到的工具,它表現的異常出色(在各種架構下,通過alloca分配記憶體就和增加棧指標一樣簡單),比malloc的效能要好很多,因為它的申請、釋放效率很高。對於linux下較小記憶體的分配,alloca能收穫讓人激動的效能。
C 中動態分配二維陣列
在釋放指標之後一定要記得將其置為null,否則在之後的程式中容易引起無法預知的錯誤。include define n 4typedef intp n 方法一用到 using namespace std intmain delete ptr1 cout endl 方法二 使用陣列指標 introw n...
C 入門經典 例5 11 動態分配空間,堆與棧
1 在程式中定義乙個變數,它的值會被放入記憶體中。如果沒有申請動態分配,它的值將會被放在棧中。棧中的變數所屬的記憶體大小是無法被改變的,它們的產生與消亡也與變數定義的位置和儲存方式有關。堆是一種與棧相對應的動態分配方式的記憶體。當我們申請使用動態分配方式儲存某個變數時,這個變數就會被放入堆中。根據需...
在子函式中對陣列進行動態分配得到NULL
樓主的函式呼叫的方式是兩個2級指標直接複製,其實也就類似於在main函式中有個int a變數,你想呼叫給a賦值的函式,呼叫的函式確實f a 這樣是不能給a賦值的。正確的做法是把a的位址賦值過去。這樣的話分配記憶體的程式應該使用3級指標。具體如下 c c code?1 2 3 4 5 6 7 8 9 ...