6

私は現在、次のような関数にいくつかのコードを持っています:

static const int kFrameCountSample = 250;
static float * samples = (float *)calloc(kFrameCountSample, sizeof(float));

サンプル配列が で 1 回だけゼロになるのが好きですcalloc()

コードを書くこともできるのでsamples、スタックに割り当てられます。

static const int kFrameCountSample = 250;
static float samples[kFrameCountSample];

しかし、現在samplesはゼロ値に初期化されていません。割り当て時にどのように初期化しますか?

4

4 に答える 4

7

あなたが与えたコード:

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 のオブジェクトは部分的に初期化されないため、配列のサイズに関係なく単一で問題ありません。配列または構造体のサブオブジェクトを初期化すると、残りのサブオブジェクトは適切な型のゼロに初期化されます。静的保存期間のオブジェクトを使用します。

于 2013-08-17T00:25:27.947 に答える
0

何かがゼロに初期化されない可能性を回避するために memset を実行できます。

static float samples[kFrameCountSample];
memset(samples,0,kFrameCountSample*sizeof(float));

http://man7.org/linux/man-pages/man3/memset.3.html

それが行うことは、サンプルのすべてのバイトに a を設定することです。つまり、すぐに 0 に初期化されます。

于 2013-08-17T01:40:38.497 に答える