[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