Como se representa un array en la pila

Iniciado por leucocito, 19 Mayo 2011, 09:08 AM

0 Miembros y 1 Visitante están viendo este tema.

leucocito

Hola que tal?


Antes de nada decir  que en la pila se que se almacenan las variables locales de una función y la dirección de retorno,pero cuando en lenguage C creamos un array de 20 bytes de espacio (que reservamos) para una variable me gustaría saber eso como se representa en la pila.

El código en C seria este

#include <stdio.h>

int main (int argc, char **argv)
{
char buffer[64]; //Declaramos un array con 64 bytes de espacio
if (argc < 2){
printf ("Introduzca un argumento al programa\n"); //Printeamos
return 0;
}
strcpy (buffer, argv[1]);

return 0;
}


El fin de de esta pregunta es entender un poco mas como funciona un desbordamiento en la pila (que se que consiste en introducir mas bytes en la pila de lo que una variable soporta de modo que sobrescribimos zonas en la que no tendríamos por que tener acceso entre ellas la dirección  de retorno.

ShotgunLogic

#1
Si no me equivoco, en la pila solamente guardas un dato, que es la dirección de memoria en la que comienza el array. De esta manera las operaciones de llamadas a procedimientos lo que haces es operar con el dato en memoria. Es por eso que siempre se pasa por referencia el array, y cualquier cambio que hagas dentro de la función lo tendrá "fuera".

Bueno eso es cuando lo pasas, pero al crearlo dentro como dices tu pues lo hará a pelo, cogera el puntero de pila y reservará espacio en memoria correspondiente al tamaño del array. Y más en C/C++ que tienes que declararlo ya con su tamaño.

Saludos!
The clans are marching against the law, bagpipers play the tunes of war, death or glory I will find, rebellion on my mind.

leucocito

Entonces cuando reserbamos un espacio en un array en C lo que estamos haciendo es reserbar un espacio en la pila para nuestra variable?

Eternal Idol

Depende del ambito, en el caso del ejemplo si, cada uno de los bytes del array esta en la pila. En este caso estan en la sección de datos:

#include <stdio.h>

char buffer[64]; //Declaramos un array con 64 bytes de espacio

int main (int argc, char **argv)
{
if (argc < 2){
printf ("Introduzca un argumento al programa\n"); //Printeamos
return 0;
}
strcpy (buffer, argv[1]);

return 0;
}
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

ShotgunLogic

Cita de: Eternal Idol en 20 Mayo 2011, 14:42 PM
Depende del ambito, en el caso del ejemplo si, cada uno de los bytes del array esta en la pila. En este caso estan en la sección de datos:

#include <stdio.h>

char buffer[64]; //Declaramos un array con 64 bytes de espacio

int main (int argc, char **argv)
{
if (argc < 2){
printf ("Introduzca un argumento al programa\n"); //Printeamos
return 0;
}
strcpy (buffer, argv[1]);

return 0;
}


Lo que había comentado yo, en ese caso lo que haces es meter en la pila la dirección del array, y la pila, ayudandose de los registros, va a coger los elementos del array que estan en memoria, ya que un array siempre se pasa por referencia.
The clans are marching against the law, bagpipers play the tunes of war, death or glory I will find, rebellion on my mind.

leucocito

Muchas gracias por las respuestas me ha quedado claro. un saludo y seguid asi!!!