Инициализировать значения массива в структуре - PullRequest
10 голосов
/ 25 марта 2012

У меня есть структура, в которой есть несколько массивов.Массивы имеют тип unsigned char [4].

Я могу инициализировать каждый элемент, вызывая

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

Просто интересно, есть ли способ инициализировать все 4 значения в одной строке.*

РЕШЕНИЕ: мне нужно было создать временный массив со всеми инициализированными значениями, а затем вызвать memset () для копирования значений в массив struct.

Ответы [ 6 ]

26 голосов
/ 25 марта 2012

Если вы действительно имеете в виду «инициализировать» в том смысле, что вы можете сделать это во время объявления переменной, то обязательно:

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

struct x mystruct = { 
   { 1, 2, 3, 4 },
   { 5, 6, 7, 8 }
};
11 голосов
/ 25 марта 2012

Когда вы создаете структуру, вы можете инициализировать ее с помощью агрегатной инициализации:

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

struct test = { 5, { 'a', 'b', 'c', 'd' } };
5 голосов
/ 25 марта 2012

Если значения совпадают, вы можете сделать что-то вроде

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

В противном случае, если значения хранятся в массиве, вы можете использовать функцию memcpy , например, так

memcpy(struct->array, some_array, sizeof(struct->array));
2 голосов
/ 25 марта 2012

Я вижу, у тебя есть указатель (да?).

Если вы выделите память для указателя с помощью calloc(), то все внутри структуры будет инициализировано с помощью 0.

В противном случае вам нужно memset() к 0 или присваивать значение поэлементно.

memset(struct_pointer, 0, sizeof *struct_pointer);
2 голосов
/ 25 марта 2012

Да:

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

struct Foo x = { { 1, 2, 3, 'a' },  { 'a', 'b', 'c', 0 } };
0 голосов
/ 25 марта 2012

Вы также можете выполнить цикл:

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

Это будет работать, даже если у вас не char, а, например, int (и values! = 0).Фактически, memsetting для, скажем, 1 структуры, сделанной из int (когда sizeof больше 1), не является правильным способом их инициализации.

...