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

Rolando Kindelan Nuñez rkindelan en uci.cu
Vie Dic 12 18:27:15 CET 2008


Gmh200 dijo

>Rolando, sólo hay un par de asuntos que no entiendo, ahí van:
 
>PRIMERO. Código de abajo:

>... add_cadena(...)
>{
> /* Abajo entiendo que esto evita posibles errores inesperados y
>     que, aquí, podría añadir más filtros */
>   if(strlen(otro_char11) >  11){} 

Eso es para asegurarte de que las cadenas no exceden de 11 caracteres porque sino explota, ya que los punteros que has definido son para estrictamente un arreglo char de 11 caracteres. Para evitar errores, que ya sabes que pueden suceder.

>   /* ¿Siguiente significa: si stringList NO_vacío haz free()?
>        ¿estamos liberando la memoria reservada en una llamada
>        anterior a la función add_cadena()? */
>  if(stringList) free(stringList);

Lo que pasa ahí es que como se hace un arreglo temporal {Temp} y se crea con malloc (todo lo que se asigna con malloc se debe liberar con free) lo que se pregunta es si a stringList se le asigno memoria if(stringList != NULL) lo que pasa es que el NULL lo omito porque es innecesario. Siempre stringList está apuntando a la dirección de memoria del arreglo Temp de la llamada anterior a add_cadena.

>   /* No entiendo la siguiente aclaración que haces
>        para el código strcpy( *(Temp[cap]), otro_char11);  */       

Lo que pasa es que como te decía cuando digo Temp[cap] en realidad estoy accediendo al puntero a arreglo de 11 caracteres que está en la posición cap (y  creo que se me olvido asignarle memoria en el correo anterior antes de poner el código de la copia), y como lo que tengo es ese puntero lo tengo que desreferenciar para acceder al dato al cual está apuntando (que en este caso es el arreglo de 11 caracteres) y entonces sí puedo copiar la cadena, directamente en el arreglo al cual se estaba apuntando en la posición cap.

>SEGUNDO. Cuándo y/o a qué debo hacer free(), una vez completadas todas las llamadas a add_cadena(); Después de mostrar las cadenas, en >otra función: ¿debo hacer: free(file_names->string_pointers)?

Cuando termines de usar la cadena debes liberarla porque siempre file_names->string_pointers tiene la memoria que se le dio en la última llamada de add_cadena, asi que si deberías usarlo. 


>Algo más sin importancia, veo que separas a las variables de dos formas. Por ejemplo: otro_char11 y stringList. En Java me han enseñado a usar la >segunda, pero tenía entendido que en C se usaba la primera. ¿Es preferible usar alguna de las dos en C?

Realmente como dices no tiene mayor importancia, es solo un estándar de código, realmente me disculpo porque el que yo utilizo es el de stringList pero me trate de ajustar al que proponías en el código y parece que se me escaparon algunos detalles. En c como en java, como en cualquier otro lenguaje de programación tu utilizas el estándar de código que más te guste, lo que pasa es que es una cuestión de legibilidad para comprender mejor lo que se programa etc.

Nota: el método add_cadena puede ser implementado también con realloc como dice Steven y queda mucho más simple ya que no tienes que crear ningún arreglo temporal ni asignarle elemento por elemento como en el ejemplo que te envié

Espero haber podido aclararte las dudas.



Ing. Rolando Kindelan Nuñez
Universidad de las Ciencias Informáticas
-------------------------------------------------------------------
"Pensar en el futuro, hace el presente más complicado."  (by rolo...)








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