Una limitación del lenguaje C es que no puede devolver arrays que provienen de la pila (Espero que llegados a este punto sepas la diferencia entre memoria dinámica y pila).
El lenguaje C nació (a grandes rasgos) como una mera traducción del lenguaje ensamblador para poder usarlo con un nivel de abstracción mayor. Esto implica que dicho lenguaje suele adolecer de algunos comportamientos extraños y este es uno de ellos.
Para solventar tu problema tienes dos opciones:
- Usas memoria dinámica para devolver la lista de elementos (que por otro lado sería más eficiente que la solución que intentas aplicar)
Código C:
Ver originallislibro
*ptr
= (lislibro
*)malloc(sizeof(lislibro
));// rellenas ptr teniendo en cuenta que es un puntero a un array
// (*ptr)[x] = y; <<--- Se puede usar así
// ...
// y antes de salir del programa hay que liberar la memoria
- En vez de usar el return, que la función reciba una lista sin inicializar como parámetro y se encargue de rellenarla.
Código C:
Ver originalvoid listar(lislibro);
int main(int argc, char *argv[]) {
lislibro libs;
listar(libs); // OBTENGO EL ARRAY LISLIBROS DE STRUCT
// ...
}
void listar(lislibro ll) {
// lislibro ll; <<--- Ya no hace falta
// ...
// return ll; <<--- esto tampoco
}
Un saludo