2012-03-25 16 views
5

Tengo curiosidad por saber si existe alguna correlación entre la longitud de la dirección de una variable (puntero) en la pila y el montón. En muchas ocasiones, he visto que los relativos a las variables de pila suelen ser más largos en comparación con Heap. Por ejemplo, considere la siguiente prueba simple:patrones de ubicación de memoria en la pila y en el montón

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    int i = 0; 
    int *j = malloc(sizeof(int)); *j = 0; 

    printf("&i = %p\n j = %p\n", &i, j); 

    free(j); 
    return 0; 
} 

salida:

&i = 0x7fffe9c7fa5c 
j = 0x100e010 

Estos resultados se obtienen en Linux usando gcc; ¿podría ser esto dependiente de OS/compilador?

+0

No estoy 100% seguro, pero supongo que es CPU/OS/Compiler específico en ese orden. Además, es probable que ni siquiera vea una dirección física. Además, el montón crece y la pila crece, por lo que la dirección de una variable de pila es mucho más baja. – Corbin

Respuesta

2

Los resultados dependen de las posiciones del montón (s) y pila (s) en el espacio de direcciones del programa. Estos están determinados por el enlazador y la arquitectura del procesador.

Debido a ASLR, los números exactos deben ser aleatorios en los sistemas modernos.

Sin embargo, los montones generalmente crecerán hacia arriba y se acumularán hacia abajo. Además, por razones de rendimiento y administración de la memoria, tanto los montones como las pilas siempre comenzarán en los límites de page.

2

Creo que es debido a las partes físicas de la memoria que decidimos que se llaman pila y pila. Como comienzan en extremos opuestos y crecen hacia el medio, tiene sentido que uno sea más bajo y el otro más alto. Sería interesante ver qué sucede si asigna 2 vars consecutivos en la pila y 2 consecutivos en la pila. Esto ayudaría a ver de qué manera crecen la pila y el montón. En realidad, creo que para que esto funcione es necesario crear un nuevo marco de pila (un nuevo método) y asignar los segundos vars allí, de lo contrario permanecerás en el mismo marco de pila.

+0

Para un programa de espacio de usuario normal, el espacio de direcciones no tiene nada que ver con las direcciones de memoria física. De lo contrario, un proceso sin privilegios podría iniciar un ataque DoS asignando una memoria física específica y, por lo tanto, evitar que otro proceso asigne la misma dirección de memoria. Es todo virtual. – phihag

+0

Puede ser memoria física o virtual, dependiendo de su sistema. De todos modos, comenzando en ambos extremos y creciendo hacia el centro, te da la máxima flexibilidad para usar todo el espacio disponible. –

Cuestiones relacionadas