[C con Clase] Array de cadenas de caracteres y paso de parámetros en C.

gmh2000 helder1986 en gmail.com
Mie Dic 10 13:40:55 CET 2008


Gracias a todos. Me he comido bien el coco pero parece que cada vez la solución va a peor. 

Da un warning y desde luego no funciona:
file_names->string_pointers = &d-> d_name;

No da errores pero la salida son cientos de caracteres sin sentido:
file_names->string_pointers = (char (*)[11]) d-> d_name;

Sin errores de compilación pero el programa casca y se cierra solo:
strncpy(file_names->string_pointers[file_names->number_of_strings++], d-> d_name, 11 );

Todas estas soluciones son SIN usar malloc(). Lo he intentado con esta función pero me da el error de siempre sobre los tipos en las asignaciones (en el código  he puesto mi intento más lógico).

Por otra parte no entiendo para que hay que reservar memoria con malloc() y/o cuando y porqué hay que liberarla con free().

Recuerdo que la versión en la que asignaba memoria de la forma "facil" con un array medio-funcionaba. Me explico: cuando pedía que me mostrara las cadenas algunas veces mostraba lo deseado, y otras veces algunas cadenas correctamente y otras en chino. Haber si esto ayuda algo para que me ayudeis. ¿Esto puede ser debido a que la cadenas las copiaba por referencia y no por valor?

Otra pregunta: ¿al hacer la copia por referencia el recolector de basura no elimina el resto de la estructura donde está contenido d->d_name?

Haber si me podeis echar el vigésimo-noveno cable. Quizás sea mejor partir de la solución que medio funcionaba, pero supongo que sería muy bueno quedarme con todos estos conceptos claros para un futuro, en cualquier caso...

Otra duda conceptual es que cuando pongo a las cadenas una longitud de 11, como se ve en el código, es porque la inmensa mayoría tienen 10 caracteres. Reservo 11 porque creo recordar que el último caracter es el /0. ¿Esto lo hago bien? ¿Puede ser el causante de los problemas esto?

Ahí va el resumen del código, con el intento de malloc:




struct strings_list
{
  char (*string_pointers)[11];
  unsigned int number_of_strings;
};

struct strings_list file_names;

get_file_names("/usr/lib/locale/", &file_names);

/* Acceso a las cadenas */
for (i = 0, i < file_names.number_of_strings; i++)
{
  muestra_cadena(file_names.string_pointers[i])
}





void get_file_names(const char *directory, struct strings_list *file_names)
{
   struct dirent *d;
   struct stat buf;
   DIR *dir;   
   file_names-> number_of_strings = 0;
   if ((dir=opendir(directory)) == NULL)
   {
      /* error */
   }   

   while ((d=readdir(dir)) != NULL)
   {   
      /* The above line avoid infinite loop */
      if (strcmp(d->d_name,".")!=0 && strcmp(d-> d_name, "..")!=0)
      {
      /* la línea de abajo da mi error preferido: incompatible types in assignment */
      file_names->string_pointers[file_names->number_of_strings] = (char *) malloc(11* sizeof(char));	
		strncpy(file_names->string_pointers[file_names->number_of_strings++], d-> d_name, 11 );

      }

   }

   closedir(dir);   

} 


Más información sobre la lista de distribución Cconclase