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: