ALLOCA
Section: Linux Programmer's Manual (3)
Updated: 2019-03-06
Index
JM Home Page
roff page
名前
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/ に書かれている。
Index
- 名前
-
- 書式
-
- 説明
-
- 返り値
-
- 属性
-
- 準拠
-
- 注意
-
- GNU 版についての注意
-
- バグ
-
- 関連項目
-
- この文書について
-
This document was created by
man2html,
using the manual pages.
Time: 03:33:26 GMT, December 05, 2022