Provided by: manpages-ja-dev_0.5.0.0.20221215+dfsg-1_all
名前
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) しようとすることのないように! 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() によって予約されるスタック領域が、 関数引数に使われるスタック領域の中に現れてしま うためである。
関連項目
brk(2), longjmp(3), malloc(3)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの 説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。