alloca -
自動的に解放されるメモリーを割り当てる
#include <alloca.h>
void *alloca(size_t size);
alloca() 関数は、
size
バイトの領域を呼出元のスタックフレームに割り付ける。
この一時的な領域は、
alloca()
を呼び出した関数が呼出元に返るときに自動的に解放される。
alloca()
関数は、割り付けた領域の始まりを指すポインターを返す。
割り付けによってスタックオーバーフローが起った場合の
プログラムの動作は定義されていない。
この節で使用されている用語の説明については、
attributes(7) を参照。
インターフェース |
属性 |
値 |
alloca() |
Thread safety |
MT-Safe |
この関数は POSIX.1
にはない。
32V, PWB, PWB.2, 3BSD, 4BSD に
alloca()
関数が登場した証拠がある。
4.3BSD
には、マニュアルページがある。
Linux は、GNU
版を使っている。
この関数は POSIX.1-2001
にはない。
alloca()
関数は、機種とコンパイラに依存する。
特定のアプリケーションでは、この関数を使うと
malloc(3) と
free(3)
を組み合わせて使った場合に比べて効率を改善することができる。
特定の場合では、この関数を使うことで、
longjmp(3) や
siglongjmp(3)
を使うアプリケーションでのメモリーの開放を簡単にすることができる。
それ以外の場合では、この関数の使用は推奨されない。
alloca()
により割り当てられる空間はスタックフレームから割り当てられるので、
関数の戻り先が
longjmp(3)
や
siglongjmp(3)
の呼び出しによりジャンプした場合には、
割り当てられた空間は自動的に解放される。
The space allocated by
alloca() is
not automatically deallocated
if the pointer that refers to it simply goes out of scope.
alloca()
で割り当てられた空間を
free(3)
しようとすることのないように!
通常
gcc(1) は
alloca()
の呼び出しをインラインコードに変換する。
-ansi,
-std=c89,
-std=c99,
-std=c11
のいずれかのオプションが指定され、
かつ <alloca.h>
がインクルードされていない場合、
この変換は行われない。
それ以外の場合 (-ansi
オプションも -std=c*
オプションも指定されない場合)
には、 glibc 版の
<stdlib.h>
は
<alloca.h>
をインクルードするが、このファイルには以下の行が含まれており、
#ifdef __GNUC__
#define alloca(size) __builtin_alloca (size)
#endif
独自版の __builtin_alloca (size)
関数がある場合、厄介な結果になる。
このコードはインライン化されているので、
この関数のアドレスを取得したり、
他のライブラリをリンクして動作を変更することはできない。
通常このインラインコードはスタックポインターを移動する
1 つの命令 (instruction)
から構成されており、
スタックオーバーフローをチェックしない。
よって NULL
エラーが返されることはない。
スタックフレームが拡張できなかった場合、エラー通知は行われない。
(しかしながら、割り当てに失敗した後で、プログラムが割り当てられなかった
空間にアクセスしようとした場合に
SIGSEGV
シグナルを受信することだろう。)
多くのシステムにおいて、関数コールの引数のリスト内では
alloca() が使えない。
これは、
alloca()
によって予約されるスタック領域が、
関数引数に使われるスタック領域の中に現れてしまうためである。
brk(2),
longjmp(3),
malloc(3)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。