Muchas gracias, me ha servido mucho este y el otro comentario. Como duda adicional. ¿Estoy haciendo bien en usar el punto para referirme a la struct siendo que es memoria dinamica? En arreglos funciona con flechas pero con matrices me marco error.
El uso de la flecha tal que:
variable->campo
Es equivalente a hacer:
(*variable).campo
La flecha simplemente permite simplificar un poco las expresiones para que no quede tan engorroso.
En este caso concreto, al ser una matriz, cuando haces:
Ya estás accediendo a un elemento de tipo <alumnos> no a un puntero, por eso tienes que usar el punto.
Si usases aritmética de punteros para acceder a la matriz (si no me he equivocado, ambas líneas muestran exactamente lo mismo):
printf("%s\n", matriz
[i
][j
].
nombre); printf("%s\n", (*(*(matriz
+ i
) + j
)).
nombre); // Usando aritmetica de punteros
Podrías simplificar la segunda expresión haciendo uso de la flecha:
printf("%s\n", (*(matriz
+ i
) + j
)->nombre
);
Pero como puedes ver, con matrices siempre es más sencillo utilizar los índices.
Ya puestos, otro extra:
Al momento de crear el struct, si utilizas typedef, no es necesario que asignes un primer nombre, bastaría con el del final.
Poner un nombre al principio y otro al final sólo es necesario si quieres hacer referencia a la propia struct dentro de sí misma.
typedef struct {
//...
//...
} InfoAlumno;
Y el nombre mejor en singular, has creado una estructura, no un array de esa estructura. Luego ya si creas un array, llamas a la variable en plural:
InfoAlumno **alumnos;