Присвоить массив массиву в структуре

Я пытаюсь присвоить массив одному из полей структуры 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 доступны для него.

Вы не можете назначать массивы, используя одно назначение. Приемлемыми способами являются либо цикл, который назначает один элемент за раз (например, for (int i = 0; i < 5; ++i) RA.array[i] = arr[i];), либо копирование памяти (например, memcpy(RA.array, arr, 5*sizeof(int)), где memcpy() объявлен в стандартном заголовке <string.h>).

Peter 04.06.2019 11:39

Пышные скобки используются для списков инициализации, поэтому для их использования вам нужно что-то инициализировать с их помощью. Но тогда возникает проблема с тем, что «массив» является указателем на выделенный блок из 5 целых чисел, немного больше. Таким образом, если вы просто делаете array = new int[] {1,2,3,4,5}, вы указываете на другой блок памяти, срок жизни которого может отличаться от вашей структуры, поэтому вам нужно memcpy или переназначить каждый элемент в цикле for.

IcedLance 04.06.2019 12:04
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
2
2
5 007
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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, поскольку это позволяет перекрывать память.

Другие вопросы по теме