地味にトラブルシューティングに迷ったので記事にしました。
問題
printf("テストコードの開始")
BYTE text[1024*1000] = {0};
if( x == y )
{
strcpy( text, string1 );
}
else
{
strcpy( text, string2 );
}
printf("テストコードの終了")
テストコードとして上記の様なコードを書いて実行したところ、スタックオーバーフローが発生しました。
ステップ実行で発生箇所を確認したところ、スタックオーバーフローが発生した位置はprintf("テストコードの開始")でした。
さて、このコードはなにが問題でしょうか?
正解
ローカル変数が確保されるスタック領域で1MBのような大きな変数を使用するとスタック領域なくなり、実行時に何らかのスタックを使用する機会があるとスタックオーバーフローを吐き出します。
ちなみに、私が使用している環境(VS2010Pro)ではデフォルトのスタックサイズは1MBとなっていました。Linuxなどでは8MBぐらい確保されている場合もあるらしいのでどこまでスタックで確保していいのかは開発環境と相談するしかないでしょう。
横着せずにヒープ領域からメモリを確保(malloc/new等)すれば問題ないんですけどね。
ちなみにVisualStudioでは、ソリューションのプロパティから「構成プロパティ」>リンカ>システムにある「スタックのサイズの設定」を指定してやればスタック容量を変更することができます。お勧めできませんが。