<div dir="ltr">Hola Marving,<div class="gmail_extra"><br><div class="gmail_quote">2014-04-13 14:28 GMT-04:00 Marving <span dir="ltr"><<a href="mailto:jr.marving@gmail.com" target="_blank">jr.marving@gmail.com</a>></span>:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Hola a todos.<br>
De nuevo por aquí con cuestiones de novatos.<br>
El programa es bastante sencillo, pero no lo suficiente para mi.<br>
Copia una array en otra.<br>
El origen no debería cambiar y el destino tendría que ser una copia del<br>
origen.<br></blockquote><div><br></div><div>Kriptus te ha respondido a esta parte.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

Pero tras esta copia el origen pierde un numero<br>
de caracteres, igual a la longitud que tenia en un principio la cadena<br>
de destino.<br>
<br></blockquote><div><br></div><div>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,</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
void copicad(char destino[], char origen[])<br>
{<br>
    int i = 0;<br>
    while ((destino[i] = origen[i]) != '\0')<br></blockquote><div><br></div><div>Aquí seguimos copiando hasta encontrar el carácter nulo de 'origen', pero en tu ejemplo, 'origen' contiene más caracteres que '</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
    {<br>
         i++;<br>
    }<br>
}<br>
<br></blockquote><div><br></div><div>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()':<br>
<div><br></div><div>Leones, tigres,\0Leones, tigres, ardillas, sapos\0</div><div>^                       ^</div><div>|                        |</div><div>destino              origen<br></div></div><div><br></div><div>Después de invocar 'copicad()', tenemos éstas:<br>
<br><div><div><div>Leones, tigres, ardillas, sapos\0 ardillas, sapos\0</div><div>^                      ^</div><div>|                       |</div><div>destino             origen<br></div></div></div></div><div><br></div>
<div>En otros compiladores, esto no ocurre, porque crea 'origen' primero y luego 'destino'. Sin embargo, tu algoritmo sobreescribiría otros datos de tu programa.</div><div><br></div><div><br></div><div>La solución a todo esto es que debes comprobar la cantidad máxima del array destinatario, para no rebasarlo.</div>
<div><br></div><div><br>Espero que esto te aclare las dudas.</div><div><br></div><div>Steven</div><div><br></div></div></div></div>