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
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