Posteriormente a consultar especialistas en esta materia, programadores de diversas áreas y profesores hemos dado con la respuesta al dilema y la compartimos en este post.
Solución:
Estás enfrentando un problema en
s1.name="Paolo";
porque, en el LHS, estás usando un array tipo, que no es asignable.
Para elaborar, desde C11
, capítulo §6.5.16
El operador de asignación tendrá un lvalue modificable como su operando izquierdo.
y, con respecto a la lvalue modificable, del capítulo §6.3.2.1
Un lvalor modificable es un lvalor que no tiene array escribe, […]
Necesitas usar strcpy()
a copiar en el array.
Dicho eso data s1 = "Paolo", "Rossi", 19;
funciona bien, porque esto no es un directo asignación que involucra al operador de asignación. Ahí estamos usando un lista de inicializadores entre llaves para proporcionar los valores iniciales de la objeto. Eso sigue la ley de inicialización, como se menciona en el capítulo §6.7.9
Cada lista de inicializadores entre llaves tiene un objeto actual asociado. Cuando no hay designaciones presentes, los subobjetos del objeto actual se inicializan en orden según el tipo de objeto actual: array elementos en orden de subíndice creciente, miembros de estructura en orden de declaración y el primer miembro nombrado de una unión.[….]
typedef struct
char name[30];
char surname[30];
int age;
data;
define eso data
debe ser un bloque de memoria que se ajuste a 60 caracteres más 4 para el int (ver nota)
[----------------------------,------------------------------,----]
^ this is name ^ this is surname ^ this is age
Esto asigna la memoria en la pila.
data s1;
Las asignaciones solo copian números, a veces punteros.
Esto falla
s1.name = "Paulo";
porque el compilador sabe que s1.name
es el comienzo de una estructura de 64 bytes de longitud, y "Paulo"
es un char[] 6 bytes de longitud (6 debido al 0 final en cadenas C)
Por lo tanto, intentar asignar un puntero a un string en una string.
Para copiar “Paulo” en la estructura en el punto name
y “Rossi” en la estructura en el punto surname
.
memcpy(s1.name, "Paulo", 6);
memcpy(s1.surname, "Rossi", 6);
s1.age = 1;
Terminas con
[Paulo0----------------------,Rossi0-------------------------,0001]
strcpy
hace lo mismo pero sabe de