alloca(3) 自動的に解放されるメモリを割り当てる

書式

#include <alloca.h>

void *alloca(size_t size);

説明

alloca() 関数は、 size バイトの領域を呼出元のスタック・フレームに割り付ける。 この一時的な領域は、 alloca() を呼び出した関数が呼出元に返るときに自動的に解放される。

返り値

alloca() 関数は、割り付けた領域の始まりを指すポインタを返す。 割り付けによってスタックオーバーフローが起った場合の プログラムの動作は定義されていない。

属性

マルチスレッディング (pthreads(7) 参照)

alloca() 関数はスレッドセーフである。

準拠

この関数は POSIX.1-2001 にはない。

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) の呼び出しによりジャンプした場合には、 割り当てられた空間は自動的に解放される。

alloca() で割り当てられた空間を free(3) しようとすることのないように!

GNU 版についての注意

通常 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() によって予約されるスタック領域が、 関数引き数に使われるスタック領域の中に現れてしまうためである。

この文書について

この man ページは Linux man-pages プロジェクトのリリース 3.65 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。