あなたが与えたコード:
static const int kFrameCountSample = 250;
static float samples[kFrameCountSample];
は有効ではありません C. 静的ストレージ期間を持つオブジェクトは、可変的に変更された型を持つことはできません。一方、これは有効です:
#define kFrameCountSample 250
static float samples[kFrameCountSample];
これは、ファイル スコープまたは関数スコープのいずれかで有効です。どちらの場合も、配列のsamples
保存期間は静的です。つまり、配列はプログラムの存続期間全体にわたって存在し、プログラムの起動時に 1 回だけ初期化されます。唯一の違いは、関数内にある場合、名前のスコープがsamples
宣言されているブロックに制限されることです。どちらの場合も、スタックに割り当てられる可能性は高くありません。
samples
ここでの配列はゼロで初期化されます。静的ストレージ期間を持つオブジェクトは決して初期化されません。明示的な初期化子を指定しない場合、それらは適切な型のゼロに初期化されます。
配列をスタックに格納する必要がある場合(つまり、宣言を含む関数に入ったときに作成され、その関数が終了したときに破棄される、C が自動格納期間と呼ぶもの)が必要な場合は、関数内で宣言し、static
キーワードを省略します。明示的な初期化子を追加します。
float samples[kFrameCountSample] = { 0 };
(この場合kFrameCountSample
、マクロである必要はありません。必要に応じてマクロにすることができstatic const int
ます)。
{ 0 }
C のオブジェクトは部分的に初期化されないため、配列のサイズに関係なく単一で問題ありません。配列または構造体のサブオブジェクトを初期化すると、残りのサブオブジェクトは適切な型のゼロに初期化されます。静的保存期間のオブジェクトを使用します。