How to initialize all members of an array to the same value? How to initialize all members of an array to the same value? arrays arrays

How to initialize all members of an array to the same value?


Unless that value is 0 (in which case you can omit some part of the initializerand the corresponding elements will be initialized to 0), there's no easy way.

Don't overlook the obvious solution, though:

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

Elements with missing values will be initialized to 0:

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

So this will initialize all elements to 0:

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

In C++, an empty initialization list will also initialize every element to 0.This is not allowed with C:

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

Remember that objects with static storage duration will initialize to 0 if noinitializer is specified:

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

And that "0" doesn't necessarily mean "all-bits-zero", so using the above isbetter and more portable than memset(). (Floating point values will beinitialized to +0, pointers to null value, etc.)


If your compiler is GCC you can use following syntax:

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

Check out detailed description:http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html


For statically initializing a large array with the same value, without multiple copy-paste, you can use macros:

#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_32Xint myArray[53] = { VAL_32X, VAL_16X, VAL_4X, VAL_1X };

If you need to change the value, you have to do the replacement at only one place.

Edit: possible useful extensions

(courtesy of Jonathan Leffler)

You can easily generalize this with:

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

A variant can be created using:

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

that works with structures or compound arrays.

#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) };

macro names are negotiable.