alloca - ライブラリコールの説明 - Linux コマンド集 一覧表
名前
alloca - メモリを割り付ける
書式
#include <alloca.h>
void *alloca(size_t
size
);
説明
alloca ()関数は、 size バイトの領域を呼出元のスタック・フレームに割り付ける。 この一時的な領域は、 alloca ()を呼び出した関数が呼出元に返るときに自動的に解放される。
返り値
alloca ()関数は、割り付けた領域の始まりを指すポインタを返す。 割り付けによってスタックオーバーフローが起った場合の プログラムの動作は定義されていない。
準拠
32v, pwb, pwb.2, 3bsd, 4bsd に alloca ()関数が登場した証拠がある。 4.3BSD には、マニュアルページがある。 Linux は、GNU 版を使っている。 この関数は POSIX.1-2001 にはない。
GNU 版についての注意
通常
gcc
は
alloca
()の呼び出しをインラインコードに変換する。
-ansi オプションまたは
-fno-builtin オプションを指定した場合は、
この操作は行われない。
だだし、デフォルトでは glibc 版の
<stdlib.h>
は
<alloca.h>
をインクルードしており、これには以下の行が含まれているので注意すること。
# define alloca(size) __builtin_alloca (size)
独自の __builtin_alloca (size) 関数があると厄介な結果になる。
このコードはインライン化されているので、 この関数のアドレスを取得したり、 他のライブラリをリンクして動作を変更することはできない。
通常このインラインコードはスタックポインタを移動する 1 つの命令 (instruction) から構成されており、 スタックオーバーフローをチェックしない。 よって NULL エラーが返されることはない。
バグ
alloca ()関数は、機種とコンパイラに依存する。 多くのシステムでは実装にバグがあるので、 この関数の使用は推奨されない。
多くのシステムにおいて、関数コールの引き数のリスト内では alloca ()が使えない。 これは、 alloca ()によって予約されるスタック領域が、 関数引き数に使われるスタック領域の中に現れてしまうためである。
関連項目
brk
(2),
pagesize
(2),
calloc
(3),
malloc
(3),
realloc
(3)