Man page - alloca(3)

Packages contains this manual

Available languages:

en fr pl ja ro de

Manual

ALLOCA

名 前
書 式
説 明
返 り 値
属 性
準 拠
注 意
GNU 版 に つ い て の 注 意
バ グ
関 連 項 目
こ の 文 書 に つ い て

名 前

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

書 式

#include <alloca.h>

void *alloca(size_t size );

説 明

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

返 り 値

alloca () 関 数 は 、 割 り 付 け た 領 域 の 始 ま り を 指 す ポ イ ン タ ー を 返 す 。 割 り 付 け に よ っ て ス タ ッ ク オ ー バ ー フ ロ ー が 起 っ た 場 合 の プ ロ グ ラ ム の 動 作 は 定 義 さ れ て い な い 。

属 性

こ の 節 で 使 用 さ れ て い る 用 語 の 説 明 に つ い て は 、 attributes (7) を 参 照 。

Image grohtml-20085-1.png

準 拠

こ の 関 数 は 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/ に 書 か れ て い る 。