5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ローカル変数配列によるスタックオーバーフロー

Posted at

地味にトラブルシューティングに迷ったので記事にしました。

問題

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では、ソリューションのプロパティから「構成プロパティ」>リンカ>システムにある「スタックのサイズの設定」を指定してやればスタック容量を変更することができます。お勧めできませんが。

5
5
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?