[C con Clase] Array de caracteres
Davidson, Steven
srd4121 en njit.edu
Dom Abr 13 22:14:42 CEST 2014
Hola Marving,
2014-04-13 14:28 GMT-04:00 Marving <jr.marving en gmail.com>:
> Hola a todos.
> De nuevo por aquí con cuestiones de novatos.
> El programa es bastante sencillo, pero no lo suficiente para mi.
> Copia una array en otra.
> El origen no debería cambiar y el destino tendría que ser una copia del
> origen.
>
Kriptus te ha respondido a esta parte.
Pero tras esta copia el origen pierde un numero
> de caracteres, igual a la longitud que tenia en un principio la cadena
> de destino.
>
>
Esto es porque has copiado caracteres de un array a otro, sin verificar el
tamaño máximo del array destinatario. Veamos el código,
void copicad(char destino[], char origen[])
> {
> int i = 0;
> while ((destino[i] = origen[i]) != '\0')
>
Aquí seguimos copiando hasta encontrar el carácter nulo de 'origen', pero
en tu ejemplo, 'origen' contiene más caracteres que '
{
> i++;
> }
> }
>
>
Ten presente que un array ES una dirección de memoria, por lo que podemos
acceder a otra dirección de memoria fuera de las limitaciones implícitas y
calculadas a partir del tamaño de sus elementos. En tu ejemplo, copiamos
todos los caracteres de 'origen' a los de 'destino'. Tu compilador crea
espacio para 'destino' de 16 caracteres y justo después crea 'origen' de 32
caracteres. Al copiar todos los caracteres a 'destino', sobreescribes los
caracteres del comienzo de 'origen'. Es decir, tienes estas cadenas antes
de invocar 'copicad()':
Leones, tigres,\0Leones, tigres, ardillas, sapos\0
^ ^
| |
destino origen
Después de invocar 'copicad()', tenemos éstas:
Leones, tigres, ardillas, sapos\0 ardillas, sapos\0
^ ^
| |
destino origen
En otros compiladores, esto no ocurre, porque crea 'origen' primero y luego
'destino'. Sin embargo, tu algoritmo sobreescribiría otros datos de tu
programa.
La solución a todo esto es que debes comprobar la cantidad máxima del array
destinatario, para no rebasarlo.
Espero que esto te aclare las dudas.
Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20140413/8c200822/attachment.html>
Más información sobre la lista de distribución Cconclase