8
float myArray[myArraySize] = {1};

上記の式では、最初の要素のみが1で初期化されます。複合リテラル(memsetではない)を使用して、値ですべての要素を初期化するにはどうすればよいですか?

UNIXでGCC4.2を使用してコンパイルしています。

4

6 に答える 6

6

これ

float myArray[100] = {[0 ... 99] = 1.0};

あなたがそれを行う方法です。

GCC ドキュメントのDesignated Initializersを参照してください。

要素の範囲を同じ値に初期化するには、「[first ... last] = value」と記述します。

于 2011-10-25T18:38:45.100 に答える
5

いいえ、最初の要素のみが1.0に初期化されます。残りは初期化されますが、C標準では0.0になります。その他の例については、Cのよくある質問をご覧ください。

于 2011-10-25T18:31:26.633 に答える
2

言語標準から:

6.7.8 初期化
...
10 自動保存期間を持つオブジェクトが明示的に初期化されていない場合、その値は不確定です。静的ストレージ期間を持つオブジェクトが明示的に初期化されていない
場合: — ポインター型の場合、null ポインターに初期化されます。
— 算術型の場合、(正または符号なし) ゼロに初期化されます。
— 集合体の場合、すべてのメンバーはこれらの規則に従って (再帰的に) 初期化されます。
— 共用体の場合、最初の名前付きメンバーは、これらの規則に従って (再帰的に) 初期化されます。
...
21 集合体の要素またはメンバーよりもブレースで囲まれたリストの初期化子が少ない場合、または既知のサイズの配列を初期化するために使用される文字列リテラルの文字が配列内の要素よりも少ない場合、集合体の残りの部分は静的ストレージ期間を持つオブジェクトと同じように暗黙的に初期化されます。

int arr[10]={1}まったく同じ結果がint arr[10]={0}生成されます。要素 0 は中括弧の間に指定されたものに初期化され、要素 1 から 9 は上記の段落 10 と 21 に基づいて 0 に初期化されます。明示的な初期化子が暗黙的な初期化子と同じ場合があるため、異なるように 見えるだけです。

于 2011-10-25T20:57:44.337 に答える
0

いいえ、すべて行う必要があります。指定されていないものには0f、float のデフォルト値が与えられます。

float myArray[4] = {1, 1, 1, 1};

単純なforループが最も保守しやすいコードになる場合があります。ここでの使用はお勧めしませんmemset

于 2011-10-25T18:32:52.107 に答える
0

この式 (memset ではない) を使用して、値を持つすべての要素をどのように初期化できますか?

ループ付き。を使用して、これを健全でポータブルな方法で行うことはできませんmemset

float myArray[myArraySize] = {1};
for (size_t i=0; i<myArraySize; i++)
    myArray[i] = 1.;

見苦しいかもしれませんが、これは C 流です (名前myArraySizeを のように変更すると、見栄えが良くなりますN)。または、要素の数が固定されている場合は、配列を列挙するだけで、オプションでサイズを省略できます。

float myArray[] = {1., 1., 1., 1., 1., 1.};
于 2011-10-25T18:33:30.073 に答える
0

C の最新バージョンで任意の配列を初期化すると、指定されていないすべてのエントリがゼロに初期化されます。

指定されていないすべてのエントリを別の値に初期化するには、memset を試すことができます。ただし、これは char 配列でのみうまく機能します。

非 char 配列の場合は、ループを記述する必要があります。

于 2011-10-25T18:33:34.930 に答える