[C con Clase] Asignación de cadenas *char

Davidson, Steven srd4121 en njit.edu
Dom Abr 3 00:22:42 CEST 2016


Hola Yolmer,

Me temo que tu conclusión es errónea. Al hacer cualquier asignación, copias
valores. En tu caso, copias el valor, guardado en 'cadena_2', a la memoria
denominada, 'cadena_1'. Para hacer la comprobación correctamente, debes
mostrar los valores guardados en los punteros. Esto es,

cout << "cadena_1 : \"" << cadena_1 << '"' << endl;
cout << "cadena_1 : [" << (void *)cadena_1 << ']' << endl;
cout << "cadena_2 : \"" << cadena_2 << '"' << endl;
cout << "cadena_2 : [" << (void *)cadena_2 << ']' << endl << endl;

delete[] cadena_1;
cadena_1 = cadena_2;  // Copiamos el valor en 'cadena_2' a 'cadena_1' =>
copiamos dirección de memoria

cout << "cadena_1 = cadena_2" << endl << endl << endl;
cout << "cadena_1 : \"" << cadena_1 << '"' << endl;
cout << "cadena_1 : [" << (void *)cadena_1 << ']' << endl;
cout << "cadena_2 : \"" << cadena_2 << '"' << endl;
cout << "cadena_2 : [" << (void *)cadena_2 << ']' << endl << endl;

strcpy( cadena_2, "cambiada" );
cout << "cadena_1 : \"" << cadena_1 << '"' << endl; cout << "cadena_1 : ["
<< (void *)cadena_1 << ']' << endl; cout << "cadena_2 : \"" << cadena_2 <<
'"' << endl; cout << "cadena_2 : [" << (void *)cadena_2 << ']' << endl <<
endl;

Verás claramente que 'cadena_1' apunta a la misma memoria que apunta
'cadena_2'. Por lo tanto, cualquier cambio en esa memoria se verá reflejada
usando cualquiera de estos dos punteros.


Espero que esto aclare la duda.

Steven


2016-04-02 16:57 GMT-04:00 Yolmer Rosales <yolmer.rosales en gmail.com>:

> hola hoy no quiero hacer preguntas.
>
> Sólo quiero compartir el resultado de un pequeño experimento que no
> resultó como esperaba. Según lo que he leído en todos lados asignar una
> cadena a otra con el operador '=' sólo copia la dirección de memoria lo
> intenté verificar con el siguiente código:
>
> char *cadena_1, *cadena_2;
> char sz = 80;
>
> cadena_1 = new char[sz];
> cadena_2 = new char[sz];
>
> strcpy(cadena_1,"Hola");
> strcpy(cadena_2,"Adios");
>
>
> cout << "cadena_1 : " << cadena_1  << endl;
> cout << "&cadena_1: " << &cadena_1 << endl;
> cout << "cadena_2 : " << cadena_2  << endl;
> cout << "&cadena_2: " << &cadena_2 << "\n\n";
>
> //strcpy(cadena_1,cadena_2);
> cadena_1 = cadena_2;
>
> cout << "cadena_1 = cadena_2\n\n"  << endl;
> cout << "cadena_1 : " << cadena_1  << endl;
> cout << "&cadena_1: " << &cadena_1 << endl;
> cout << "cadena_2 : " << cadena_2  << endl;
> cout << "&cadena_2: " << &cadena_2 << "\n\n";
>
> strcpy(cadena_2,"cambiada");
> cout << "cadena_1 : " << cadena_1  << endl;
> cout << "&cadena_1: " << &cadena_1 << endl;
> cout << "cadena_2 : " << cadena_2  << endl;
> cout << "&cadena_2: " << &cadena_2 << endl;
>
>
> y mi salida es la siguiente:
>
> cadena_1 : Hola
> &cadena_1: 0x22ff08
> cadena_2 : Adios
> &cadena_2: 0x22ff04
>
> cadena_1 = cadena_2
>
>
> cadena_1 : Adios
> &cadena_1: 0x22ff08
> cadena_2 : Adios
> &cadena_2: 0x22ff04
>
> cadena_1 : cambiada
> &cadena_1: 0x22ff08
> cadena_2 : cambiada
> &cadena_2: 0x22ff04
>
> Process returned 0 (0x0)   execution time : 0.053 s
> Press any key to continue.
>
> se ve claramente que si asigno la cadena y no la dirección de memoria. me
> sorprende y a la vez me va a facilitar las cosas.
>
> ya sabía que la clase string permite esto pero nunca pensé que el *char
> también
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20160402/30c24607/attachment.html>


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