шаблоны расположения памяти в стеке и куче - PullRequest
5 голосов
/ 25 марта 2012

Мне просто любопытно, есть ли какая-либо корреляция между длиной адреса переменной (указателя) в стеке и куче. Во многих случаях я видел, что те, которые касаются переменных стека, обычно длиннее, чем куча. Например, рассмотрим следующий простой тест:

#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;
}

выход:

&i = 0x7fffe9c7fa5c
 j = 0x100e010

Эти результаты получены в Linux с использованием gcc; это может зависеть от ОС / компилятора?

Ответы [ 2 ]

2 голосов
/ 25 марта 2012

Я полагаю, что это из-за физических частей памяти, которые мы решили, что они называются стеком и кучей. Поскольку они начинаются с противоположных концов и растут к середине, имеет смысл, что один ниже, а другой выше. Было бы интересно посмотреть, что произойдет, если вы выделите 2 последовательных переменных в стеке и 2 последовательных в куче. Это поможет увидеть, в каком направлении растут стек и куча. На самом деле, я думаю, чтобы это работало, вам нужно создать новый фрейм стека (новый метод) и выделить там вторые переменные, в противном случае вы останетесь в том же фрейме стека.

2 голосов
/ 25 марта 2012

Результаты зависят от положения кучи (ов) и стека (ов) в адресном пространстве программы.Они определяются архитектурой компоновщика и процессора.

Из-за ASLR точные числа должны быть случайными в современных системах.

Тем не менее, кучи обычно растут вверх, искладывается вниз.Кроме того, по соображениям производительности и управления памятью кучи и стеки всегда будут начинаться с границ page .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...