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

Yolmer Rosales yolmer.rosales en gmail.com
Dom Abr 3 02:19:36 CEST 2016


me di cuenta después que envié el mail me sentí tan tonto...  :-P


El 2 de abril de 2016, 17:52, Davidson, Steven <srd4121 en njit.edu> escribió:

> 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
>>
>>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20160402/a365de8a/attachment.html>


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