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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

4 Estructuras <strong>de</strong> Datos y Algoritmos<br />

Zona estática<br />

Stack<br />

x<br />

20<br />

3.2.3. Visión lógica <strong>de</strong>l stack.<br />

Figura 3.2. Stack al salir <strong>de</strong> <strong>la</strong> función.<br />

Los diagramas anteriores <strong>de</strong>scrib<strong>en</strong> lógicam<strong>en</strong>te el espacio asignado <strong>en</strong> <strong>la</strong> <strong>memoria</strong> para <strong>la</strong>s<br />

variables estáticas y automáticas. Cada compi<strong>la</strong>dor implem<strong>en</strong>ta físicam<strong>en</strong>te <strong>la</strong> creación <strong>de</strong> estos<br />

espacios <strong>de</strong> manera difer<strong>en</strong>te; <strong>en</strong> el frame <strong>de</strong> <strong>la</strong> función se suel<strong>en</strong> almac<strong>en</strong>ar: <strong>la</strong> dirección <strong>de</strong><br />

retorno, los valores <strong>de</strong> los registros que <strong>la</strong> función no <strong>de</strong>be alterar; a<strong>de</strong>más <strong>de</strong>l espacio para<br />

locales y argum<strong>en</strong>tos. Adicionalm<strong>en</strong>te cada compi<strong>la</strong>dor establece conv<strong>en</strong>ios para pasar los<br />

valores y obt<strong>en</strong>er el retorno <strong>de</strong> <strong>la</strong> función, <strong>en</strong> algunos casos lo hace a través <strong>de</strong> registros, <strong>en</strong><br />

otras a través <strong>de</strong>l stack. El uso <strong>de</strong>tal<strong>la</strong>do <strong>de</strong>l stack según lo requiere un programador assembler<br />

es cubierto <strong>en</strong> cursos <strong>de</strong> estructuras <strong>de</strong> computadores.<br />

Se <strong>de</strong>scribe aquí una visualización lógica <strong>de</strong>l segm<strong>en</strong>to <strong>de</strong>l stack, que es <strong>la</strong> que requiere un<br />

programador <strong>en</strong> l<strong>en</strong>guajes <strong>de</strong> alto nivel.<br />

Ejemplo 3.2. Riesgos <strong>de</strong> <strong>la</strong> <strong>de</strong>saparición <strong>de</strong>l frame.<br />

La sigui<strong>en</strong>te función plocal retorna un puntero a una variable local, lo cual es un gran error, ya<br />

que al salir <strong>de</strong> <strong>la</strong> función, <strong>de</strong>ja <strong>de</strong> existir <strong>la</strong> local; y el puntero retornado apunta a una dirección<br />

<strong>de</strong>l stack que no está asignada.<br />

int* plocal(void)<br />

{<br />

int local;<br />

// ****<br />

return(&local); // retorna puntero a local<br />

}<br />

La función que invoca a plocal posiblem<strong>en</strong>te produzca una fal<strong>la</strong> seria <strong>de</strong>l programa, o g<strong>en</strong>erará<br />

un error <strong>de</strong> difícil <strong>de</strong>puración.<br />

Tampoco pue<strong>de</strong> tomarse <strong>la</strong> dirección <strong>de</strong> una variable local, <strong>de</strong>c<strong>la</strong>rada <strong>de</strong> tipo registro. Ya que<br />

los registros no ti<strong>en</strong><strong>en</strong> asociada una dirección <strong>de</strong> <strong>la</strong> <strong>memoria</strong>. El calificar una variable local o a<br />

un argum<strong>en</strong>to <strong>de</strong> tipo register, es una indicación para que el compi<strong>la</strong>dor int<strong>en</strong>te emplear<br />

registros <strong>en</strong> su manipu<strong>la</strong>ción, con v<strong>en</strong>tajas temporales <strong>de</strong> acceso.<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!