Я пытаюсь присвоить массив одному из полей структуры typedef и не могу найти способ сделать это практически.
Я искал эту проблему, но все, что я, кажется, нашел, это ответы для массивов char *, которые я не ищу, я просто пытаюсь присвоить массив массиву int и ищу практический способ для приведенный ниже код работает без необходимости инициализировать все переменные в структуре (они будут инициализированы позже, но я просто хочу установить переменную массива):
typedef struct {
int array[5];
int number;
} Rot;
Rot RA;
void config()
{
RA.array = {1, 2, 3, 4, 5}; //This returns an "expected expression before "{"" error
int arr[5];
int i;
for (i = 0; i < 5; i++)
{
arr[i] = i + 1;
}
RA.array = arr; //I understand why this fails, but I need to do this in a practical way
}
Предположим, что config вызывается позже, и структура и RA доступны для него.
Пышные скобки используются для списков инициализации, поэтому для их использования вам нужно что-то инициализировать с их помощью. Но тогда возникает проблема с тем, что «массив» является указателем на выделенный блок из 5 целых чисел, немного больше. Таким образом, если вы просто делаете array = new int[] {1,2,3,4,5}, вы указываете на другой блок памяти, срок жизни которого может отличаться от вашей структуры, поэтому вам нужно memcpy или переназначить каждый элемент в цикле for.



RA.array = {1, 2, 3, 4, 5};
memcpy(RA.array, (int[]){1, 2, 3, 4, 5}, sizeof RA.array);
RA.array = arr;
memcpy(RA.array, arr, sizeof arr); // better: sizeof RA.array
Вы можете использовать memcpy, как показано в другом ответе. Или, наоборот, скопируйте всю структуру, а не только массив, используя временную переменную в виде составной литерал:
RA = (Rot) { {1, 2, 3, 4, 5}, 0 };
Это возможно, потому что, хотя C не позволяет присваивать массивы во время выполнения, он разрешает это для структур.
Вы можете использовать memcpy, как показано в другом ответе, или скопировать всю структуру, как показано в другом ответе (хотя в вашем вопросе говорится, что вы просто хотите установить массив, а не оставшуюся часть структуры).
Другой вариант — встроить только массив в другую структуру:
typedef struct {
int elem[5];
} RotArr;
typedef struct {
RotArr arr;
int number;
} Rot;
Затем вы можете получить доступ к элементу i массива в Rot RA как RA.arr.elem[i]. Кроме того, вы можете присваивать значения всему RotArr объекту. Остальная часть вашего кода может выглядеть примерно так:
Rot RA;
void config(void)
{
RA.arr = (RotArr){{1, 2, 3, 4, 5}};
RotArr arr;
int i;
for (i = 0; i < 5; i++)
{
arr.elem[i] = i + 1;
}
RA.arr = arr;
}
Обратите внимание, что (RotArr){{1, 2, 3, 4, 5}} — это значение составной литерал типа RotArr. Его также можно записать как (RotArr){ .elem = {1, 2, 3, 4, 5} } или (RotArr){ .elem = { [0] = 1, [1] = 2, [2] = 3, [3] = 4, [4] = 5 } }, чтобы было абсолютно ясно, какие части составного литерала задаются явно (любые оставшиеся части будут установлены в 0), но, поскольку он состоит только из одного члена, эти формы составного литерального значения немного преувеличены.
Следующее работает в соответствии с синтаксисом C. Не уверен, что это то, что вы хотели.
#include <string.h>
#include <stdio.h>
typedef struct {
int array[5];
int number;
} Rot;
Rot RA = {{1,2,3,4,5}};
void main()
{
RA = (Rot) {{5, 6, 7, 8, 9}};
int arr[5];
int i;
for (i = 0; i < 5; i++)
{
arr[i] = i + 1;
}
memmove(RA.array, arr, sizeof(RA.array));
// OR
int l = sizeof(arr)/sizeof(arr[0]);
for(int i =0 ; i < l ; ++i) {
*(RA.array + i) = *(arr + i);
printf("%d\n",RA.array[i]);
}
}
Кроме того, используйте memmove, поскольку это позволяет перекрывать память.
Вы не можете назначать массивы, используя одно назначение. Приемлемыми способами являются либо цикл, который назначает один элемент за раз (например,
for (int i = 0; i < 5; ++i) RA.array[i] = arr[i];), либо копирование памяти (например,memcpy(RA.array, arr, 5*sizeof(int)), гдеmemcpy()объявлен в стандартном заголовке<string.h>).