nazareth escribió:PD: es recomendable que cuando declaras el array reserves memoria? siempre?
No es que sea recomendable, es que siempre que declaras una variable (del tipo que sea) es el modo de "reservar" memoria. Lo que pasa que hay dos modos de reservar memoria: estáticamente o dinámicamente.
Por ejemplo, en este caso, si supieses que siempre va a haber, por ejemplo, 100 ficheros en todos los directorios, pues podrías declarar el array estáticamente, tal que así:
char nombres[100][255];
Lo anterior indica que el array va a tener 100 nombres, y cada nombre a su vez tiene 254 caracteres como máximo (no se si lo sabrás, pero las cadenas deben terminar siempre en '\0', de ahí que aunque reserve para 255 caracteres en verdad el nombre solo podrá tener 254, si reservamos 50, solo podremos guardar 49, y así siempre).
En cambio, seguramente los usuarios de tu app no te hagan caso y quieran tener los ficheros que les de la gana en un directorio
, así que no te queda otra que reservar memoria dinámicamente, tal y como te puse antes:
char **nombres = malloc(numero_de_ficheros * sizeof(char*));
for (i = 0; i < numero_de_ficheros; i++)
nombres[i] = malloc(255 * sizeof(char));
En la primera línea estamos asignando memoria para que quepan en el array tantos nombres como valor tenga "numero_de_ficheros" almacenado. Si vale 100, cabran 100 o menos; si vale 50, cabran 50 o menos; etc.
Luego, debemos asignar a cada string, una por una, su capacidad. Ahí entra en juego el "for".
Como ves, asignar la memoria dinámicamente te da más control, pero como contrapartida eres tu el responsable de liberar esa memoria (si lo haces estáticamente, se gestiona "sola"). De ahí que luego de usar una variable declarada con "malloc" debas liberarla con "free".
Y creo eso es todo lo que te puedo decir, espero que me haya explicado medianamete bien
nazareth escribió:Podrías explicar un poco el code? ^^''
Creo que lo que te puede chocar más es ¿por que no declarar el array en la función "getFileNamesOfDir" y devolverlo? Simple, por que es uno de los principios básicos de gestión de memoria. Si una función reserva memoria dentro de ella, es su responsabilidad liberar esa memoria antes de retornar (esto es un "convenio", no es una obligación, por ejemplo hay casos en los que es necesario reservar memoria en una función y no librarla en la misma, pero suele ser cuando estes implementando algún tipo de estructura de datos. Sin ir más lejos, puede que "opendir" haga algún "malloc" y que el "closedir" haga sus correspondientes "free").
Y en este caso eso no sería posible. De ahí que primero inicializo el array y luego le paso el bufer a la función para que me lo llene. Una vez llenado el array, lo uso y cuando termine con el lo libero.
Y eso es todo, si ves que no entiendes algo más o quieres que profundice en algo, dímelo e intentaré escribirte otro tochaco
Un saludo