Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

c structure array initializing

I have structure

struct ABC {
  int a; 
  int b;
}

and array of it as

struct ABC xyz[100];

I want to initialize it a = 10 and b = 20; for all array element.

Which is better way ?

like image 843
Hemant Avatar asked Feb 03 '14 13:02

Hemant


3 Answers

While there is no particularly elegant way to initialize a big array like this in C, it is possible. You do not have to do it in runtime, as some answers falsely claim. And you don't want to do it in runtime, suppose the array is const?

The way I do it is by defining a number of macros:

struct ABC {
  int a; 
  int b;
};

#define ABC_INIT_100 ABC_INIT_50 ABC_INIT_50
#define ABC_INIT_50  ABC_INIT_10 ABC_INIT_10 ABC_INIT_10 ABC_INIT_10 ABC_INIT_10
#define ABC_INIT_10  ABC_INIT_2 ABC_INIT_2 ABC_INIT_2 ABC_INIT_2 ABC_INIT_2
#define ABC_INIT_2   ABC_INIT_1 ABC_INIT_1
#define ABC_INIT_1   {10, 20},

int main()
{
  struct ABC xyz[100] =
  {
    ABC_INIT_100
  };
}

Note that macros like these can be combined in any way, to make any number of initializations. For example:

#define ABC_INIT_152 ABC_INIT_100 ABC_INIT_50 ABC_INIT_2
like image 142
Lundin Avatar answered Sep 28 '22 00:09

Lundin


With GCC you can use its extended syntax and do:

struct ABC xyz[100] = { [0 ... 99].a = 10, [0 ... 99].b = 20 };

For a portable solution I'd probably initialize one instance, and use a loop to copy that instance to the rest:

struct ABC xyz[100] = { [0].a = 10, [0].b = 20 };

for(size_t i = 1; i < sizeof xyz / sizeof *xyz; ++i)
  xyz[i] = xyz[0];

This is somewhat cleaner to me than having the actual values in the loop. It can be said to express the desired outcome at a slightly higher level.

The above syntax ([0].a and [0].b) is not an extension, it's typical C99.

like image 32
unwind Avatar answered Sep 28 '22 00:09

unwind


for(unsigned int i=0; i<100; i++)
{
    xyz[i].a = 10;
    xyz[i].b = 20;
}
like image 26
n0p Avatar answered Sep 27 '22 23:09

n0p