Autor
|
Tema: Duda con structs C/C++ (Leído 8,463 veces)
|
SARGE553413
Desconectado
Mensajes: 176
|
Hola a todos, expongo mi duda:
Tengo que usar la función gethostbyname(), que devuelve un struct hostent*. El problema es que este puntero está declarado como static, por tanto esta función devuelve SIEMPRE la misma dirección de memoria. Por tanto en sucesivas llamadas se van "pisando" datos. Quiero conseguir que ésto no pase.
La solución que se me ocurre es hacer otra función que "construya" otro hostent* no static, copiarle los valores y devolverlo.
Mi pregunta es si C/C++ tiene algún mecanismo para copiar estructuras (hacer "a=b" no me vale porque así se copian las direcciones de memoria).
Gracias.
|
|
« Última modificación: 21 Junio 2013, 02:06 am por SARGE553413 »
|
En línea
|
|
|
|
ralymontes
Desconectado
Mensajes: 47
|
Para copiar estructuras se tiene que hacer elemento a elemento. En el caso de los strings tienes que usar strcpy().
Saludos!
|
|
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
Para copiar estructuras se tiene que hacer elemento a elemento. En el caso de los strings tienes que usar strcpy().
Saludos!
Depende, en C++ se puede definir un operador = específico para la estructura: struct Tonteria { int Miau; int* Cosa; Tonteria operator=(const Tonteria &t) // Operador = { Miau = t.Miau; *Cosa = *t.Cosa; return *this; // Devuelvo una referencia a la misma clase, esto me sirve para concatenar varios = } };
Y ya podrías usar el operador = sin problemas: Tonteria1 = Tonteria2;
|
|
|
En línea
|
|
|
|
xiruko
Desconectado
Mensajes: 438
|
Pues a mi esto me funciona perfectamente... #include <stdio.h> #include <string.h> struct prueba { int a; char b; char c[100]; }; int main() { struct prueba p1, p2, *p3, p4; // se inicializa p1 p1.a = 10; p1.b = 'A'; // se copia p1 a p2 y se imprime p2 = p1; printf("p2: %d %c %s\n", p2. a, p2. b, p2. c); // p3 apunta a p1 p3 = &p1; // se copia *p3 a p4 y se imprime p4 = *p3; printf("p4: %d %c %s\n", p4. a, p4. b, p4. c); return 0; }
Así que sí, puedes copiar structs directamente. En el ejemplo que te he dado también lo tienes con punteros. Saludos.
|
|
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
Pues a mi esto me funciona perfectamente... #include <stdio.h> #include <string.h> struct prueba { int a; char b; char c[100]; }; int main() { struct prueba p1, p2, *p3, p4; // se inicializa p1 p1.a = 10; p1.b = 'A'; // se copia p1 a p2 y se imprime p2 = p1; printf("p2: %d %c %s\n", p2. a, p2. b, p2. c); // p3 apunta a p1 p3 = &p1; // se copia *p3 a p4 y se imprime p4 = *p3; printf("p4: %d %c %s\n", p4. a, p4. b, p4. c); return 0; }
Así que sí, puedes copiar structs directamente. En el ejemplo que te he dado también lo tienes con punteros. Saludos. ¿Seguro? Prueba esto: #include <stdio.h> #include <string.h> struct prueba { int a; char b; char c[100]; }; int main() { struct prueba p1, p2, *p3, p4; // se inicializa p1 p1.a = 10; p1.b = 'A'; // se copia p1 a p2 y se imprime p2 = p1; printf("p2: %d %c %s\n", p2. a, p2. b, p2. c); // p3 apunta a p1 p3 = &p1; // se copia *p3 a p4 y se imprime p4 = *p3; printf("p4: %d %c %s\n", p4. a, p4. b, p4. c); // Ahora modifico c en p4) p4.c[2] = 'z'; // Compruebo p1... WTF QUE HA PASADO? printf("p1: %d %c %s\n", p1. a, p1. b, p1. c); return 0; }
Estas usando la misma cadena en las 4 estructuras. Si modificas un dato en una la modificaras en todas
|
|
|
En línea
|
|
|
|
xiruko
Desconectado
Mensajes: 438
|
Pues diciéndomelo tan seguro me esperaba que cambiara, pero si te soy sincero la salida de p1 es la del principio, sin la 'z' modificada xD EDITO: De hecho poder se puede: http://stackoverflow.com/questions/9127246/copy-struct-to-struct-in-cLo único que no sé a qué se refiere con estructuras simples. Esta noche con más calma lo miro bien, que desde siempre he creído que se podían copiar y ahora resulta que no es tan trivial... Saludos.
|
|
« Última modificación: 21 Junio 2013, 15:02 pm por xiruko »
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
Pues diciéndomelo tan seguro me esperaba que cambiara, pero si te soy sincero la salida de p1 es la del principio, sin la 'z' modificada xD Cierto, creo que ya he pillado el problema (un array no responda igual que un puntero al parecer). Prueba ahora: #include <stdio.h> #include <string.h> struct prueba { int a; char b; char* c; }; int main() { struct prueba p1, p2, p3, p4; // se inicializa p1 p1.a = 10; p1.b = 'A'; p1.c = new char[100]; strcpy(p1.c, "ola k ase"); // se copia p1 a p2 y se imprime p2 = p1; printf("p2: %d %c %s\n", p2.a, p2.b, p2.c); // p3 apunta a p1 p3 = p1; // se copia *p3 a p4 y se imprime p4 = p3; printf("p4: %d %c %s\n", p4.a, p4.b, p4.c); // Ahora modifico c en p4) p4.c[2] = 'z'; // Compruebo p1... WTF QUE HA PASADO? printf("p1: %d %c %s\n", p1.a, p1.b, p1.c); return 0; }
Se puede hacer directamente si las estructuras no tienen punteros. Si los tiene te compilará pero te puedes encontrar problemas extraños en la ejecución (como ya he planteado antes). Esta es una de las razones por las que se inventaron los operadores en C++.
|
|
« Última modificación: 21 Junio 2013, 15:15 pm por amchacon »
|
En línea
|
|
|
|
kmilinh0
Desconectado
Mensajes: 16
|
Debes reservar espacio en memoria para guardar las estructuras, lo mas directo es un array de estructuras hostent. Posteriormente, puedes usar: memcpy( puntero1, puntero2, numeroBytes ) Esto es Ansi C, el clasico vamos. Esta funcion copia los bytes q quieras de una direccion de memoria a otra. Copiará de puntero2 a puntero1. Por tanto tu puntero1 es la posicion del array donde vayas a guardar la estructura hostent y puntero2 es el hostent*. memcpy( &array[i], hostent_puntero, sizeof(hostent) ); o algo asi jeje
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
Cierto, creo que ya he pillado el problema (un array no responda igual que un puntero al parecer). No hay problema en utilizar el operador de asignación '=' para copiar estructuras pero se debe tener en cuenta el resultado de este: A) Al copiarse un array se copia este como una unidad (el valor de todos sus elementos). B) Al copiarse un puntero (para el caso cualquier objeto) se copia el valor almacenado. En el ultimo caso y tratándose de punteros la dirección en memoria sera la misma y por ende un cambio en el objeto apuntado tendrá efecto en todas las estructuras (ya que todas apuntan a ese objeto). Un saludo
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Structs Y Clases
.NET (C#, VB.NET, ASP)
|
anion
|
1
|
2,444
|
14 Julio 2007, 04:26 am
por MANULOMM
|
|
|
Duda con ficheros y structs en C
Programación C/C++
|
chica_23
|
9
|
5,817
|
19 Marzo 2011, 20:24 pm
por chica_23
|
|
|
Problema structs
Programación C/C++
|
Ccomplica
|
1
|
2,143
|
30 Octubre 2013, 05:53 am
por edr89
|
|
|
Array de structs duda con los nombres C#
.NET (C#, VB.NET, ASP)
|
RevolucionVegana
|
2
|
3,398
|
3 Junio 2017, 05:31 am
por Eleкtro
|
|
|
Duda sobre structs!!!
Programación C/C++
|
pablombf
|
1
|
2,055
|
10 Enero 2018, 03:23 am
por Serapis
|
|