alloca

Man page of ALLOCA
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/alloca.3.html


多くのシステムにおいて、関数コールの引き数のリスト内では alloca() が使えない。 これは、 alloca() によって予約されるスタック領域が、 関数引き数に使われるスタック領域の中に現れてしまうためである。

なぜ関数の引数で使えないのか?

C FAQ 7
http://www.kouno.jp/home/c_faq/c7.html


7.32:
alloca()とは何者で、なぜ使わないほうがよいと人は言うのか。

A:
alloca()は領域を割り当て、alloca()を起動した関数を抜けた時点で その領域は自動的に解放される。すなわちalloca()によって割り当て られた領域は、特定の関数の「スタックフレーム」やその関数の前後 の状況に局所的となる。

alloca()を移植性が高いように書くことはできないし、スタックのな いマシン上に実装することは難しい。これを使うことは、戻り値を直 接別の関数に渡す場合に(すぐに思いつくような実装では、スタック に基づくマシンでは必ず失敗する)、たとえば fgets(alloca(100),100, stdin)のような式で問題を招く。

これらの理由により、alloca()は便利にみえるが、広く移植性が高く なければならないプログラムでは使うことはできない。

こうなるリスク?


│ │
├───┤ new fp
│arg1 │
├───┤
│alloca│
├───┤
│arg2 │
│arg3 │
fp ├───┤ new sp
│//////│
│//////│
sp ├───┤
│//////│