[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Pregunta técnica sobre C



On Sat, 22 Apr 2000, Francisco José Avila Bermejo wrote:
> ¿Cómo copiarias una estructura con esto campos?

Más o menos como indicabas.

>   // Copiamos la lista de alias
>   ptr = tmp->h_aliases;
>   ia->h->h_aliases = new char*[16];

Eso es muy peligroso. Nadie te dice que van a ser 16 alias, y o te pasas o
te quedas corto. Usar arrays de número fijo no va a darte más que
problemas.

>   while (*tmp->h_aliases) {
>     *ia->h->h_aliases = new char[strlen(*tmp->h_aliases)+1];
>     strcpy(*ia->h->h_aliases++, *tmp->h_aliases++);

Es muy sospechoso hacer el *tmp->h_aliases++, quizás de problemas
internamente si en la siguiente llamada el sistema quiere liberar esa
memoria usando el puntero ese. Yo que tu no modificaría el valor, y usaría
una variable para acceder a los diferentes punteros.

>   // Copiamos la lista de direcciones
>   ia->h->h_addr_list = new char*[1];

Igual que antes, no sabes cuántos va a haber.

Aparte de eso, la estructura duplicada no va a ser exácta, porque tus
arrays de punteros a cadenas no acaban en un puntero NULL. Si luego
intentas pasar esa copia a alguna función que dependa de ese NULL, lo
llevas crudo, podría cascar, especialmente con la lista de direcciones
donde ni si quiera reservas espacio para más de un puntero, y eso que
siguiendo la suposición de que todas las estructuras van a tener al menos
una dirección el mínimo tendría que ser dos punteros, el segundo a NULL.

> ¿No habría una forma más fácil?

No, ¿pero es difícil?
-- 
  Grzegorz Adam Hankiewicz      -            gradha@iname.com
    http://glub.ehu.es/         -     http://welcome.to/gogosoftware/


Reply to: