Выделение памяти в стеке и куче
Это может показаться очень простым вопросом, но это было в моей голове так:
Когда мы выделяем локальную переменную, она переходит в стек. Подобное динамическое распределение приводит к тому, что переменная переходит в кучу. Теперь, на мой вопрос, эта переменная фактически лежит на стеке или куче, или мы будем просто ссылкой в стеке и куче.
Например,
Предположим, что я объявляю переменную int i
. Теперь этот i
выделяется в стеке. Итак, когда я печатаю адрес i
, это будет одно из местоположений в стеке? Тот же вопрос для кучи.
Ответы
Ответ 1
Я не совсем уверен, что вы спрашиваете, но я постараюсь ответить.
Следующее объявляет переменную i
в стеке:
int i;
Когда я запрашиваю адрес с помощью &i
, я получаю фактическое местоположение в стеке.
Когда я выделяю что-то динамически с помощью malloc
, на самом деле хранятся TWOstrong > части данных. Динамическая память выделяется в куче, а сам указатель выделяется в стеке. Итак, в этом коде:
int* j = malloc(sizeof(int));
Это распределение пространства в куче для целого числа. Он также выделяет пространство в стеке для указателя (j
). Значение переменной j
устанавливается на адрес, возвращаемый malloc
.
Ответ 2
Надеемся, что полезно следующее:
void foo()
{
// an integer stored on the stack
int a_stack_integer;
// a pointer to integer data, the pointer itself is stored on the stack
int *a_stack_pointer;
// make a_stack_pointer "point" to integer data that allocated on the heap
a_stack_pointer = (int*)malloc(10 * sizeof(int));
}
В случае стековых переменных сама переменная (фактические данные) сохраняется в стеке.
В случае выделенной кучи памяти базовые данные всегда хранятся в куче. Указатель на эту память/данные может храниться локально в стеке.
Надеюсь, что это поможет.
Ответ 3
Переменная указателя будет находиться в стеке. Память, на которую указывает указатель, будет находиться в куче.
int *i = malloc(sizeof(int));
i
будет находиться в стеке, фактическая память, на которую я указываю *i
, будет находиться в куче.
Ответ 4
Я согласен с Крисом. Еще один способ объяснить это. Рассмотрим следующий код:
int* j = malloc(sizeof(int));
free(j);
Даже после использования free (j), который должен освободить память от кучи, указатель все еще существует, и нам нужно явно сделать его NULL. Это определенно говорит о том, что существует также совпадение стека указателя, иначе оно должно было существовать после свободной команды. Эта переменная стека указана на адрес в куче, где память была динамически распределена с помощью malloc.
Ответ 5
стек или куча не являются отдельной памятью, они представляют собой сегменты памяти, которые система запускает для текущей программы, просто разные способы организации данных в памяти.
Итак, когда вы получаете & i, это адрес памяти, простой в этом.