Reputation: 411
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.
Upvotes: 19
Views: 116070
Reputation: 9671
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.
Upvotes: 2
Reputation: 108988
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);
Upvotes: 3
Reputation: 582
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));
Upvotes: 12
Reputation: 75130
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' } };
Upvotes: 19
Reputation: 477040
Yes:
struct Foo
{
unsigned char a[4];
unsigned char b[4];
};
struct Foo x = { { 1, 2, 3, 'a' }, { 'a', 'b', 'c', 0 } };
Upvotes: 3
Reputation: 224924
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 }
};
Upvotes: 38