Ответ 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
Каждый список инициализаторов, заключенный в фигурные скобки, имеет связанный с ним текущий объект. Когда нет обозначений, субобъекты текущего объекта инициализируются в порядке к типу текущего объекта: элементы массива в возрастающем порядке подстроки, структура членов в порядке декларации и первого имени члена союза. [....]