Provided by: manpages-ja-dev_0.5.0.0.20131015+dfsg-2_all bug

名前

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

書式

       #include <alloca.h>

       void *alloca(size_t size);

説明

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

返り値

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

関連項目

       brk(2), longjmp(3), malloc(3)

この文書について

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