Initialize values of array in a struct

2020-02-06 05:43发布

问题:

I have a struct which has several arrays within it. The arrays have type unsigned char[4].

I can initialize each element by calling

struct->array1[0] = (unsigned char) something;
... 
struct->array1[3] = (unsigned char) something;

Just wondering if there is a way to initialize all 4 values in one line.

SOLUTION: I needed to create a temporary array with all the values initialized, then call memset() to copy the values to the struct array.

回答1:

If the values are the same, you might do something like

struct->array[0] = struct->array[1] = struct->array[2] = struct->array[3] = (unsigned char) something;

Otherwise, if the values are stored in an array, you can use the memcpy function like so

memcpy(struct->array, some_array, sizeof(struct->array));


回答2:

If you really mean "initialize" in the sense that you can do it at the time you declare the variable, then sure:

struct x {
  unsigned char array1[4];
  unsigned char array2[4];
};

struct x mystruct = { 
   { 1, 2, 3, 4 },
   { 5, 6, 7, 8 }
};


回答3:

When you create the struct, you can initialise it with aggregate initialisation:

struct test {
    int blah;
    char arr[4];
};

struct test = { 5, { 'a', 'b', 'c', 'd' } };


回答4:

Yes:

struct Foo
{
    unsigned char a[4];
    unsigned char b[4];
};

struct Foo x = { { 1, 2, 3, 'a' },  { 'a', 'b', 'c', 0 } };


回答5:

I see you have a pointer (do you?).

If you allocate memory for the pointer with calloc() everything inside the struct will be initialized with 0.

Otherwise you need to memset() to 0 or assign a value element-by-element.

memset(struct_pointer, 0, sizeof *struct_pointer);


回答6:

You can loop too:

  for(i = 0; i < 4; i++) the_struct->array1[i] = (unsigned char) something;

This will work even when you have not char but e.g. int (and values != 0). In fact, memsetting to, say, 1 a struct made of int (when sizeof int greater than 1) is not the correct way to initialize them.