19

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
  • I must say that this is so well-known that some googling would have revealed the answer quickly... stackoverflow.com/questions/201101/… ;-) Commented Mar 24, 2012 at 22:10

6 Answers 6

39

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 }
};
Sign up to request clarification or add additional context in comments.

3 Comments

I mean more in the sense that once the struct is created to edit each value with the arrays.
Gotcha - then you can either use memset() to set them all to the same value, or make a template array and memcpy() it if you want them to be different. Besides that, pretty much all you can do is assign them one by one.
This solution is not very likely practical with the given correct syntax. So -1
19

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' } };

1 Comment

What if I wanted the array in the struct to be a pointer, how to do it then ? Like this: typedef struct { int blah; char *arr; }test; test t1 = { 5, { 'a', 'b', 'c', 'd' } };
12

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

1 Comment

This was what I needed to do. I had tried creating a temp array and making it equal but I needed to memcpy. Thanks!
3

Yes:

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

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

Comments

3

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

1 Comment

Thank you. The memset part is what helped me.
2

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.