Для этой строки:
student.table.subject[5] = {'B', 'C', 'D', 'E', 'F'};
Я полагаю, что OP считает, что строка присваивает значения всем элементам массива student.table.subject[5]
так же, как char subject[5] = {'B', 'C', 'D', 'E', 'F'};
инициализирует все элементы массива subject[5]
. Они могут выглядеть аналогично, но назначение не совпадает с инициализацией.
Есть некоторые проблемы с назначением, предпринятым выше. : -
Задача 1: {'B', 'C', 'D', 'E', 'F'}
в правой части выражения присваивания не является значением любого типа. Его можно превратить в значение типа char [5]
, изменив его на составной литерал . (char [5]){'B', 'C', 'D', 'E', 'F'}
является составным литералом типа char [5]
; он также может быть записан как (char []){'B', 'C', 'D', 'E', 'F'}
, где количество элементов определяется числом инициализаторов между фигурными скобками. Это безымянный объект массива.
Проблема 2. В большинстве выражений значение типа массива преобразуется в указатель на первый элемент массива и больше не является lvalue, Левый операнд оператора присваивания =
должен быть lvalue. Следовательно, левый операнд оператора присваивания не может быть массивом.
Существуют различные способы решения проблемы OP. : -
Решение 1. Используйте memcpy
для копирования значений из другого массива:
static const char subjects[5] = {'B', 'C', 'D', 'E', 'F'};
memcpy(student.table.subject, subjects, 5);
или:
memcpy(student.table.subject, (char [5]){'B', 'C', 'D', 'E', 'F'}, 5);
(Примечание. Используется составной литерал , содержащий содержимое исходного массива для копирования в место назначения.)
или:
memcpy(student.table.subject, "BCDEF", 5);
(Примечание: "BCDEF"
используется только для удобство там. Он имеет тип char [6]
, включая нулевой терминатор, но копируются только первые 5 элементов.)
Решение 2. Используйте for
l oop, чтобы скопировать значения из другого массива. :
static const char subjects[5] = {'B', 'C', 'D', 'E', 'F'};
for (i = 0; i < 5; i++)
{
student.table.subject[i] = subjects[i];
}
или:
for (i = 0; i < 5; i++)
{
student.table.subject[i] = ((char []){''B', 'C', 'D', 'E', 'F'})[i];
}
или:
for (i = 0; i < 5; i++)
{
student.table.subject[i] = "BCDEF"[i];
}
Решение 3. Присвойте каждому элементу массива линейную последовательность операторов:
student.table.subject[0] = 'B';
student.table.subject[1] = 'C';
student.table.subject[2] = 'D';
student.table.subject[3] = 'E';
student.table.subject[4] = 'F';
(Примечание: для большого количества элементов это будет утомительно и будет неэффективно использовать исполняемую память, если компилятор не сможет оптимизировать ее до эквивалента memcpy
.)