動作環境
C++ Builder XE4
症状
- 200,000個の要素を持つdouble型配列を定義
- 実行時にエラーが発生
プロジェクトProject1.exeは例外クラス $C00000FD (メッセージ 'stack overflow at 0xXXXXX')を送出しました
問題のコード
Unit1.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
static const int kNum = 200000;
void __fastcall TForm1::FormCreate(TObject *Sender)
{
double vals[kNum] = { 0.0 };
}
//---------------------------------------------------------------------------
対応案1
vals[]の定義にstaticを付けて静的領域の定義にする。
void __fastcall TForm1::FormCreate(TObject *Sender)
{
static double vals[kNum] = { 0.0 };
}
静的領域
-
組込み | C > link > 変数の値の自動0初期化? | 初期化用関数を使ったRAM変数の初期化
- メモリの4領域 @ Takashi Kanamaru's Web Page
-
第10回目 4大メモリその2 Static領域 と 分割コンパイル @ Theoride Technology様
- 3.staticな記憶領域(静的変数用メモリ)について
関数内の配列定義は通常スタック領域になる。
スタック領域を超えた要素数で定義されたときに'stack overflow at 0xXXXXX'になる。
組込みでも行う対処であるが、staticをつけることで、スタック領域でなく、静的領域に変更している。
備考
関数内で200,000個の配列を定義する必要があるか、は別の検討事項でもある。
該当コードについてはnew/deleteでの実装に変更した。