この質問は、C99 の可変長配列に関するこの質問に関連していますが、これとは異なります。
答えは、可変長配列 (または固定サイズの単なる大きな配列) をスタックに割り当てる際の 1 つの危険性は、たとえば、malloc
割り当てが成功したかどうかを呼び出し元に明示的に伝える を呼び出すのとは対照的に、割り当てがサイレントに失敗する可能性があることを指摘しています。
最新の非組み込みコンパイル プラットフォームは、無効なメモリ ゾーンを使用して、追加コストなしでスタック オーバーフローを検出します (チェックは、MMU によって既に無料で行われているチェックのみです)。ローカル配列が非常に大きいと、スタック ポインタが無効な領域を飛び越える可能性があるため、上記の問題を 100% 回避することはできません。
この検出に通常割り当てられるページ数を知っている人はいますか? 少なくとも 4KiB になると思いますが、それ以上になる可能性もあります。それはコンパイラーまたは OS によって選択されたものですか? どちらの場合でも、それを変更する方法はありますか?