在 GNU C 中,alloca() 提供了一種獨特的記憶體分配方式——「半動態」。它像 malloc() 一樣能在執行期依據變數大小動態申請記憶體,但分配的空間位於呼叫函式的堆疊上,隨著函式返回自動釋放,無需手動呼叫 free()。
#include <stdlib.h> void *alloca(size_t size);
範例:在函式內動態建立大小由參數決定的陣列:
void process(int n) {
int *buf = alloca(n * sizeof(int)); // 堆疊上分配
// 使用 buf...
// 函式結束時自動釋放,無需 free()
}
| 優點 | 缺點 |
|---|---|
| 無記憶體洩漏風險(自動釋放) | 錯誤時無明確錯誤訊息(如堆疊溢位直接崩潰) |
| 分配/釋放極快(指標移動) | 非 GNU 系統相容性差(BSD 擴展,其他平台可能只能模擬,效能較差) |
| 適合迴圈中逐次增大緩衝區 | 大量分配易導致堆疊溢位 |
C99 引入的變長陣列 (int arr[n];) 也能實現類似功能,但兩者有關鍵差異:
alloca() 分配的空間持續到函式結束。alloca() 可在迴圈中重複呼叫,每次疊加堆疊空間;VLA 在迴圈中重複宣告會導致編譯錯誤或未定義行為。alloca() 是 GNU C 提供的「半動態」利器,以堆疊速度換取自動管理便利,但犧牲了可移植性與錯誤診斷能力。現代開發應優先採用 C99 VLA 或標準堆積分配 (malloc/free),僅在特定效能敏感、環境可控場景下謹慎使用 alloca()。