配列のすべてのメンバーを同じ値に初期化する方法は?

その値が 0 でない限り (この場合、初期化子の一部を省略でき、対応する要素が 0 に初期化されます)、簡単な方法はありません。

ただし、明白な解決策を見逃さないでください:

int myArray[10] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };

値が欠落している要素は 0 に初期化されます:

int myArray[10] = { 1, 2 }; // initialize to 1,2,0,0,0...

したがって、これはすべての要素を 0 に初期化します:

int myArray[10] = { 0 }; // all elements 0

C++ では、空の初期化リストもすべての要素を 0 に初期化します。これは C では許可されていません:

int myArray[10] = {}; // all elements 0 in C++

noinitializer が指定されている場合、静的ストレージ期間を持つオブジェクトは 0 に初期化されることに注意してください:

static int myArray[10]; // all elements 0

また、「0」は必ずしも「全ビットゼロ」を意味するわけではないため、上記を使用する方が memset() よりも移植性が高く、優れています。 (浮動小数点値は +0 に初期化され、NULL 値へのポインターなど)


コンパイラが GCC の場合、次の構文を使用できます:

int array[1024] = {[0 ... 1023] = 5};

詳細な説明を確認してください:http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html


大きな配列を同じ値で静的に初期化するには、複数回のコピーと貼り付けを行わずに、マクロを使用できます:

#define VAL_1X     42
#define VAL_2X     VAL_1X,  VAL_1X
#define VAL_4X     VAL_2X,  VAL_2X
#define VAL_8X     VAL_4X,  VAL_4X
#define VAL_16X    VAL_8X,  VAL_8X
#define VAL_32X    VAL_16X, VAL_16X
#define VAL_64X    VAL_32X, VAL_32X

int myArray[53] = { VAL_32X, VAL_16X, VAL_4X, VAL_1X };

値を変更する必要がある場合は、1 か所だけで置換を行う必要があります。

編集:便利な拡張機能の可能性

(Jonathan Leffler 提供)

これを簡単に一般化できます:

#define VAL_1(X) X
#define VAL_2(X) VAL_1(X), VAL_1(X)
/* etc. */

バリアントは以下を使用して作成できます:

#define STRUCTVAL_1(...) { __VA_ARGS__ }
#define STRUCTVAL_2(...) STRUCTVAL_1(__VA_ARGS__), STRUCTVAL_1(__VA_ARGS__)
/*etc */ 

構造体または複合配列で機能します。

#define STRUCTVAL_48(...) STRUCTVAL_32(__VA_ARGS__), STRUCTVAL_16(__VA_ARGS__)

struct Pair { char key[16]; char val[32]; };
struct Pair p_data[] = { STRUCTVAL_48("Key", "Value") };
int a_data[][4] = { STRUCTVAL_48(12, 19, 23, 37) };

マクロ名は交渉可能です。