Cómo almacenar un valor en un array de una estructura en C
Tengo una estructura como esta:
struct student {
<pre><code>char name[50];
int grade;
</code></pre>
<p>};
<code>
Quiero crear un array de estructuras (una por cada estudiante, usando malloc).
</code>
struct student <em>studs=malloc(STUDENT_NUM</em>sizeof(struct student));
Después de eso recorrí mis arrays que contienen la información de los estudiantes y luego intenté almacenar esa información en cada estructura. Hasta ahora, me aparece un fallo de segmentación pero no entiendo por qué.
for(int i=0;i<STUDENT_NUM;i++){
strcpy(Names[i],studs[i].name);
studs[i].grade=Grades[i];
}
Encontré otro enfoque, que funciona, pero solo quiero saber cómo puedo hacer que funcione usando la estructura anterior.
Así que la “solución que encontré en realidad consiste en cambiar el campo de la estructura a:
char name;
Y luego en el bucle simplemente asigno espacio para ese array así:
studs[i].name=malloc(50sizeof(char));
¿Por qué mi primer enfoque me da un fallo de segmentación? ¿No he asignado memoria al utilizar esa inicialización char name[50];
?
**También a tener en cuenta que estoy aprendiendo C (por si no era obvio).
Gracias de antemano.
davy.ai
La razón por la que estás obteniendo un error de segmentación en tu primer enfoque es porque no estás asignando memoria para el campo
name
de tu estructurastruct student
. Cuando declaraschar name[50]
, estás asignando espacio para un array de caracteres de 50 elementos en la pila, pero esta memoria no es accesible por la funciónmalloc
. Entonces, cuando intentas copiar el nombre desde tu array de entrada astuds[i].name
, estás intentando escribir en memoria que no ha sido reservada pormalloc
, lo cual resulta en un error de segmentación.Para solucionarlo, puedes asignar memoria para el campo
name
de cada estructurastruct student
usandomalloc
, de la misma forma en que lo hiciste para el array de estudiantes. Una forma de hacer esto sería modificar tu bucle de la siguiente manera:En este bucle actualizado, estamos asignando memoria para el campo
name
de cadastruct student
usandomalloc
, luego estamos copiando el nombre y la calificación desde nuestros arrays de entrada a la correspondientestruct student
. Esto debería prevenir el error de segmentación que estabas experimentando.Alternativamente, podrías cambiar el campo
name
de tustruct student
a unchar*
, como lo hiciste en tu segundo enfoque, y asignar memoria usandomalloc
cuando sea necesario. Esto te permitirá asignar solo la cantidad necesaria de memoria para cada nombre, en lugar de reservar la misma cantidad de memoria (50 caracteres) para cada nombre. Sin embargo, deberás recordar liberar esta memoria cuando hayas terminado de usarla.Ten en cuenta que en este caso, necesitas asignar memoria para cada
studs[i].name
utilizandostrlen
en lugar de un tamaño fijo, ya que cada nombre puede tener una longitud diferente. También debes recordar liberar cadastuds[i].name
utilizandofree
cuando hayas terminado con ella, para evitar fugas de memoria.