c語言動態分配記憶體及記憶體分配部分函式

2021-08-31 07:03:38 字數 2690 閱讀 4746

#include

/**在c中動態分配記憶體的基本步驟有:

1,用malloc類的函式分配記憶體;

2,用這些記憶體支援應用程式

3,用free函式釋放記憶體

二、動態記憶體分配函式

malloc :從堆上分配記憶體

realloc : 在之前分配的記憶體塊的基礎上,將記憶體重新分配為更大或者更小的部分

calloc: 從堆上分配記憶體並清零

free:將記憶體塊返回堆

*/void mainaa()

//為字串分配記憶體,將其初始化,並逐個字元列印字串,然而每次迭代name都會增加1,最後name會指向字串結尾的nul字元,

//分配記憶體的起始位址丟失了

void mainbb()

}/**

使用calloc函式

calloc會在分配的同時清空記憶體,該函式的原型如下:void *calloc(size_t numelements,size_t elementsize);

calloc函式會根據numelements和elementsize兩個引數的乘積來分配記憶體,並返回乙個指向記憶體的第乙個位元組的指標。如果不能分配記憶體

則返回null,此函式最初用來輔助分配陣列記憶體。

如果numelements或elementsize為0,那麼calloc可能返回空指標。如果calloc無法分配記憶體就會返回空指標,而且全域性變數errno會設定為enomem(記憶體不足),

這是posix錯誤碼,有的系統上可能沒有

**/void maincc()

/**realloc函式

realloc函式會重新分配記憶體,原型:void *realloc(void *ptr,size_t size);

realloc函式返回指向記憶體塊的指標。該函式接受兩個引數,第乙個引數是指向原記憶體塊的指標,第二個是請求的大小。重新分配的塊大小和第乙個引數

引用的塊大小不同。返回值是指向重新分配的記憶體的指標。

請求的大小可以比當前分配的位元組數小或者大。如果比當前分配的小,那麼多餘的記憶體會還給堆,不能保證多餘的記憶體會被清空。如果比當前分配的大,

那麼可能的話,就在緊挨著當前分配記憶體的區域分配新的記憶體,否則就會在堆的其他區域分配並把舊的記憶體複製到新區域。

如果大小是0而指標非空,那麼就釋放記憶體。如果無法分配空間,那麼原來的記憶體塊就保持不變,不過返回的指標是空指標,且errno會設定為enmoem,

**/void maindd()

/**alloca函式和變長陣列

alloca函式(微軟為malloca)在函式的棧幀上分配記憶體。函式返回後會自動釋放記憶體。若低層的執行時系統不基於棧,

allocal函式會很難實現,所以這個函式時不標準的,如果應用程式需要可移植就盡量避免使用它。

c99引入了變長陣列(vla),允許函式內部宣告和建立其長度由變數決定的陣列,比如:

void compute(int size)

這意味著記憶體分配在執行時完成,且將記憶體作為棧幀的一部分來分配。另外,如果陣列用到sizeof操作符,也是在執行時而不是編譯時執行。

這麼做只會有一點小小的執行時開銷。而且一旦函式退出,立即釋放記憶體。因為我們沒有用malloc這類函式來建立陣列,所以不應該用free函式來

釋放它。alloca函式也不應該返回指向陣列所在記憶體的指標,但是可以解決。

vla的長度不能改變,一經分配其長度就固定了。

**//**

動態記憶體分配技術

1,資源獲取即初始化

資源獲取即初始化(resource acquisition is initialization,raii)是bjarne stroustrup發明的技術,可以用來解決c++中資源的分配和釋放。

即使有異常發生,這種技術也能保證資源的初始化和後續的釋放。分配的資源最終總是會得到釋放。

有好幾種方法可以在c中使用raii。gnu編譯器提供了非標準的擴充套件來支援這個特性,通過演示如何在乙個函式中分配記憶體然後釋放可以說明這種

擴充套件。一旦變數超出作用域會自動觸發釋放過程。

gnu的擴充套件需要用到raii_variable巨集,它宣告乙個變數,然後給變數關聯如下屬性

1,乙個型別。

2,建立變數時執行的函式。

3,變數超出作用域時執行的函式。

這個巨集如下所示:

#define raii_variable(vartype,varname,initval,dtor)\

void _dtor_ ## varname (vartype * v)\

vartype varname __attribute__((cleanup(_dtor_ ## varname))) = (initval)

在下例中,我們將name變數宣告為字元指標。建立它時會執行malloc函式,為其分配32位元組。當函式結束時,name超出作用域就會執行free函式:

void raiiexample()

函式執行後會列印"raii_example"字串。不用gnu擴充套件也可以達到類似效果。

2、使用異常處理函式

另外一種處理記憶體釋放的方法是利用異常處理。儘管異常處理不屬於標準c,但如果可以使用它且不考慮移植問題,它會很有用。下面說明利用

microsoft visua studio版的c語言的方法。

這裡的try塊包含任何可能在執行時丟擲異常的語句。不管有沒有異常丟擲,都會執行finally塊,因此也一定會執行free函式。

void exceptionexample()

__finally}*/

C語言動態分配記憶體

動態開闢記憶體的函式 void malloc size t size 這個函式向記憶體申請 塊連續可 的空間,並返回指向這塊空間的指標 如果開闢成功,則返回 個指向開闢好空間的指標 如果開闢失敗,則返回 個null指標,因此malloc的返回值 定要做檢查 返回值的型別是 void 所以malloc...

記憶體動態分配

陣列的元素儲存於記憶體中連續的位置上。當乙個陣列被宣告時,它所需要的內存在編譯時就被分配。但是,你也可以使用動態記憶體分配在執行時為它分配記憶體。malloc所分配的是一塊連續的記憶體。例如,如果請求它分配100個位元組的記憶體,那麼它實際分配的記憶體就是100個連續的位元組,並不會分開位於兩塊或多...

動態分配記憶體

動態記憶體分配即分配記憶體大小在執行時才確定,一般在堆中分配。c語言動態記憶體分配相關的函式。include void malloc size t size malloc的使用比較直接,乙個成功的malloc呼叫返回分配的size大小的記憶體的指標。失敗時返回null並將錯誤 置為enomem。教材...