Saltar al contenido

“error: asignación a la expresión con array error de tipo “cuando asigno un campo de estructura (C)

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 terminación, por lo que no necesita la longitud codificada.

Alternativamente, puede definir una estructura que puntos a matrices de caracteres de cualquier longitud.

typedef struct 
  char *name;
  char *surname;
  int age;
 data;

Esto creará

[----,----,----]

Esto ahora funcionará porque está llenando la estructura con punteros.

s1.name = "Paulo";
s1.surname = "Rossi";
s1.age = 1;

Algo como esto

[---4,--10,---1]

Donde 4 y 10 son punteros.

Nota: las entradas y los punteros pueden ser de diferentes tamaños, los tamaños 4 anteriores son 32 bits como ejemplo.

Consulte este ejemplo aquí: Acceso a miembros de estructura

Se explica que la forma correcta de hacerlo es así:

strcpy(s1.name , "Egzona");
printf( "Name : %sn", s1.name);

Recuerda que puedes compartir esta sección si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *