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

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.