alloca 在堆疊上分配記憶體
警告: 為了完整起見,此處僅提及 alloca
。它完全不可移植(不受任何通用標準的保護),並且具有許多潛在危險的功能,使其不安全。現代 C 程式碼應該用可變長度陣列 (VLA) 代替它。
#include <alloca.h>
// glibc version of stdlib.h include alloca.h by default
void foo(int size) {
char *data = alloca(size);
/*
function body;
*/
// data is automatically freed
}
在呼叫者的堆疊幀上分配記憶體,當呼叫者函式完成時,返回指標引用的空間將自動釋放 。
雖然此功能便於自動記憶體管理,但請注意,請求大量分配可能導致堆疊溢位,並且你不能將 free
與分配了 alloca
的記憶體一起使用 (這可能會導致更多堆疊溢位問題)。
由於這些原因,不建議在迴圈內使用 alloca
, 也不建議使用遞迴函式。
並且因為在函式返回時記憶體是 free
’d ,你不能將指標作為函式結果返回( 行為將是未定義的 )。
摘要
- 呼叫與
malloc
相同 - 功能返回時自動釋放
- 與
free
,realloc
函式不相容 ( 未定義的行為 ) - 指標不能作為函式結果返回( 未定義的行為 )
- 堆疊空間限制的分配大小,(在大多數機器上)比
malloc()
可用的堆空間小很多 - 避免在單個函式中使用
alloca()
和 VLA(可變長度陣列) alloca()
不像malloc()
等人那樣便攜
建議
- 不要在新程式碼中使用
alloca()
Version >= C99
現代替代品。
void foo(int size) {
char data[size];
/*
function body;
*/
// data is automatically freed
}
這適用於 alloca()
,並且在 alloca()
沒有的地方工作(例如在內部迴圈中)。它確實假定 C99 實現或未定義 __STDC_NO_VLA__
的 C11 實現。