Provided by: manpages-ja-dev_0.5.0.0.20221215+dfsg-1_all bug

名前

       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/ に書かれている。