15.02.2014 Views

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

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!