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 相同
  • 功能返回時自動釋放
  • freerealloc 函式不相容 ( 未定義的行為
  • 指標不能作為函式結果返回( 未定義的行為
  • 堆疊空間限制的分配大小,(在大多數機器上)比 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 實現。