Подтвердить что ты не робот

"ошибка: присваивание выражению с ошибкой типа массива", когда я назначаю поле структуры (C)

Я начинающий программист C, вчера я узнал, как использовать C-структуры и возможное их применение в решении конкретных проблем. Однако, когда я экспериментировал с моей C IDE (Codeblocks 16.01), чтобы изучить этот аспект программирования на C, я столкнулся с какой-то странной проблемой. Код следующий:

#include <stdio.h>

#define N 30

typedef struct{
     char name[N];
     char surname[N];
     int age;
} data;

int main() {
     data s1;
     s1.name="Paolo";
     s1.surname = "Rossi";
     s1.age = 19;
     getchar();
     return 0;
}

Во время компиляции компилятор (GCC 4.9.3-1 под Windows) сообщил мне сообщение об ошибке

"ошибка: назначение выражения с ошибкой типа массива"

по инструкции

s1.name="Paolo" 
s1.surname="Rossi" 

а если я делаю

    data s1 = {"Paolo", "Rossi", 19};

он работает. Что я делаю не так?

4b9b3361

Ответ 1

Вы столкнулись с проблемой в

 s1.name="Paolo";

потому что в LHS вы используете тип массива, который не присваивается.

Чтобы разработать, из C11, глава §6.5.16

оператор присваивания должен иметь изменяемое значение lvalue в качестве его левого операнда.

и, в отношении модифицируемого значения l, из главы §6.3.2.1

Модифицируемое lvalue является значением l, которое не имеет типа массива, [...]

Вам нужно использовать strcpy() для копирования в массив.

Тем не менее, data s1 = {"Paolo", "Rossi", 19}; отлично работает, поскольку это не является прямым назначением с использованием оператора присваивания. Там мы используем список инициализаторов, заключенный в скобки, чтобы обеспечить начальные значения объекта. Это следует за законом инициализации, как указано в главе §6.7.9

Каждый список инициализаторов, заключенный в фигурные скобки, имеет связанный с ним текущий объект. Когда нет обозначений, субобъекты текущего объекта инициализируются в порядке к типу текущего объекта: элементы массива в возрастающем порядке подстроки, структура членов в порядке декларации и первого имени члена союза. [....]

Ответ 2

Пожалуйста, проверьте этот пример здесь: Доступ к членам структуры

Понятно, что правильный способ сделать это выглядит следующим образом:

strcpy(s1.name , "Egzona");
printf( "Name : %s\n", s1.name);