alloca() の使用が良い習慣と見なされないのはなぜですか?

答えは 09 にあります ページ (少なくとも Linux では):

決して使ってはいけないというわけではありません。私が取り組んでいる OSS プロジェクトの 1 つは、それを悪用しない限り、広く使用しています (12 'ing 大きな値)、問題ありません。 「数百バイト」のマークを超えたら、24 を使用します。 代わりに、友達。それでも割り当てエラーが発生する可能性がありますが、少なくともスタックを吹き飛ばすのではなく、エラーの兆候が見られるでしょう.


私が持っていた最も記憶に残るバグの 1 つは、30 を使用するインライン関数に関するものでした。 .これは、プログラム実行のランダムなポイントでスタック オーバーフローとして現れました (スタックに割り当てられるため)。

ヘッダー ファイル内:

void DoSomething() {
   wchar_t* pStr = alloca(100);
   //......
}

実装ファイル内:

void Process() {
   for (i = 0; i < 1000000; i++) {
     DoSomething();
   }
}

それで何が起こったのかというと、コンパイラは 40 をインライン化しました 関数とすべてのスタック割り当ては 58 内で行われていました 機能し、スタックを爆破します。私の弁護では (問題を発見したのは私ではありませんでした。問題を解決できなかったときは、上級開発者の 1 人に泣き叫びました)、それはまっすぐではありませんでした。 、ATL 文字列変換マクロの 1 つでした。

だから教訓は - 70 を使わないことです インライン化される可能性があると思われる関数内。


古い質問ですが、可変長配列に置き換える必要があるとは誰も言いませんでした。

char arr[size];

の代わりに

char *arr=alloca(size);

これは標準の C99 にあり、多くのコンパイラでコンパイラ拡張機能として存在していました。