名 前
alloca − 自 動 的 に 解 放 さ れ る メ モ リ ー を 割 り 当 て る
書 式
#include <alloca.h>
void *alloca(size_t size);
説 明
alloca() 関 数 は 、 size バ イ ト の 領 域 を 呼 出 元 の ス タ ッ ク フ レ ー ム に 割 り 付 け る 。 こ の 一 時 的 な 領 域 は 、 alloca() を 呼 び 出 し た 関 数 が 呼 出 元 に 返 る と き に 自 動 的 に 解 放 さ れ る 。
返 り 値
alloca() 関 数 は 、 割 り 付 け た 領 域 の 始 ま り を 指 す ポ イ ン タ ー を 返 す 。 割 り 付 け に よ っ て ス タ ッ ク オ ー バ ー フ ロ ー が 起 っ た 場 合 の プ ロ グ ラ ム の 動 作 は 定 義 さ れ て い な い 。
属 性
マ ル チ ス レ ッ デ ィ ン グ (pthreads(7) 参 照 )
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() に よ っ て 予 約 さ れ る ス タ ッ ク 領 域 が 、 関 数 引 き 数 に 使 わ れ る ス タ ッ ク 領 域 の 中 に 現 れ て し ま う た め で あ る 。
関 連 項 目
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。