重複の可能性:
alloca()はどのような場合に役立ちますか?
私は最近、alloca()関数の使用を偶然目にしました。グーグル検索は、それがスタックにスペースを割り当てるために使用されていることを私に教えてくれました。アプリケーションを取得できませんか?また、これを使用する際の落とし穴はありますか?
重複の可能性:
alloca()はどのような場合に役立ちますか?
私は最近、alloca()関数の使用を偶然目にしました。グーグル検索は、それがスタックにスペースを割り当てるために使用されていることを私に教えてくれました。アプリケーションを取得できませんか?また、これを使用する際の落とし穴はありますか?
この関数alloca
は、C 標準の一部ではありませんでした。これは通常、C99 の可変長配列 (「VLA」) のようなものを実現するための拡張機能としてベンダーによって提供されています。
void foo(int n)
{
char arr99[n]; // C99-style VLA
char * p89 = alloca(n); /* C89 work-around using "alloca" */
// Usage:
for (int i = 0; i != n; ++i)
{
arr99[i] = p89[i] = '0' + i;
}
} // memory is freed automatically here
どちらの場合も、メモリは自動的に管理され、関数の終了時に解放されます。
の使用はalloca
、C オブジェクト モデルに完全に適合しないため、精神的に負担がかかります。たとえば、ネストされたスコープでメモリを割り当てても、ブロックだけでなく、囲んでいる関数の最後まで生き続けます。VLA ははるかに優れたセマンティクスを持ち、動的にクエリを実行できますが、 -allocated メモリsizeof
には同等のメカニズムはありません。alloca
動的に見える割り当て (たとえば、実行時に変化するサイズを使用) を行いたい場合に便利ですが、呼び出したコードalloca()
が範囲外になると、すべてが消去されることを確認してください。
すべての自動 (「スタック」) 割り当てと同様に、誤ってポインターを有効よりも長く格納すると、足を痛めます。