Cap. 3 Administración de la memoria en C. - Inicio
Cap. 3 Administración de la memoria en C. - Inicio
Cap. 3 Administración de la memoria en C. - Inicio
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
20 Estructuras <strong>de</strong> Datos y Algoritmos<br />
No se valida si el espacio a continuación <strong>de</strong> <strong>de</strong>stino pue<strong>de</strong> almac<strong>en</strong>ar el string fu<strong>en</strong>te sin<br />
sobreescribir <strong>en</strong> el espacio asignado a otras variables. Este es un serio problema <strong>de</strong>l l<strong>en</strong>guaje, y<br />
se lo ha empleado para introducir código malicioso <strong>en</strong> aplicaciones que no vali<strong>de</strong>n el rebalse <strong>de</strong><br />
buffers.<br />
Esta función ti<strong>en</strong>e su prototipo <strong>de</strong>finido <strong>en</strong> <br />
Un ejemplo <strong>de</strong> uso.<br />
#inclu<strong>de</strong> <br />
#inclu<strong>de</strong> <br />
char string[10]; /*crea string con espacio para 10 caracteres */<br />
char * str1 = "abc<strong>de</strong>fghi"; /* ti<strong>en</strong>e 10 caracteres, incluido el NULL que termina el string.*/<br />
int main(void)<br />
{ strcpy(string, str1);<br />
printf("%s\n", string);<br />
printf(str1); //sin string <strong>de</strong> formato<br />
return 0;<br />
}<br />
Note que <strong>en</strong> <strong>la</strong> invocación se pasan los nombres <strong>de</strong> los strings, que son consi<strong>de</strong>rados punteros<br />
constantes. En lugar <strong>de</strong> string, se podría haber escrito: &string[0].<br />
No se ocupa el retorno <strong>de</strong> <strong>la</strong> función, <strong>en</strong> este caso se usa como procedimi<strong>en</strong>to no como función.<br />
Arreglos <strong>de</strong> gran<strong>de</strong>s dim<strong>en</strong>siones no convi<strong>en</strong>e <strong>de</strong>finirlos <strong>de</strong>ntro <strong>de</strong> <strong>la</strong> función, ya que podrían<br />
producir un rebalse <strong>de</strong>l stack; es preferible <strong>de</strong>finirlos <strong>en</strong> zona estática o <strong>en</strong> el heap.<br />
Tradicionalm<strong>en</strong>te se m<strong>en</strong>ciona que el diseño <strong>de</strong> strcpy pue<strong>de</strong> ser difícil <strong>de</strong> <strong>en</strong>t<strong>en</strong><strong>de</strong>r. Se<br />
muestran a continuación, dos diseños basados <strong>en</strong> arreglos; y su evolución a códigos basados <strong>en</strong><br />
punteros.<br />
void strcpy1(char <strong>de</strong>stino[], const char fu<strong>en</strong>te[])<br />
{ int i = 0;<br />
while (1)<br />
{<br />
<strong>de</strong>stino[i] = fu<strong>en</strong>te[i];<br />
if (<strong>de</strong>stino[i] == '\0') break; // copió fin <strong>de</strong> string<br />
i++;<br />
}<br />
}<br />
Debido a que <strong>en</strong> el l<strong>en</strong>guaje C, <strong>la</strong> asignación es una expresión, y por lo tanto ti<strong>en</strong>e un valor, se<br />
pue<strong>de</strong> escribir:<br />
Profesor Leopoldo Silva Bijit 20-01-2010