Назначен ли примитиву адрес памяти?

Я пытаюсь понять процесс объявления и присвоения примитивного типа на заднем этапе.

  1. int i;
  2. i = 3;

Для 1) в стеке памяти он назначает пространство для хранения значения типа int с именем i Для 2), он присваивает значение 3 пространству, сохраненному выше

Там есть адрес памяти? По моему впечатлению, адрес памяти всегда связан с объектами в куче?

Обновить:

По поводу ответов:

Таким образом, для каждой переменной в стеке всем им присваивается адрес памяти, также как и объекты в куче. Я прав?

Но для Java это не так?

4 ответа

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

add $2, $0, 3

поместить значение 3 в регистр 2. Как только вы создадите указатель и сделаете так, чтобы он указывал на эту переменную, тогда у вас действительно есть адрес. И тогда переменная уже не может быть в регистре.

Предполагая, что вы говорите о C или C++ (я не могу сказать), да. Вы можете получить доступ к адресу следующим образом:

int i = 3;

int *k = &i; // k now is a pointer to i

*k = 4; // assigns the value k points to (i) to 4, i is now 4

Как еще происходит переполнение стекового буфера?:) кто-то должен писать в указатель на стек.

Действительно, стек - это особая область виртуальной памяти процесса, поэтому все в стеке имеет адреса памяти. Глава стека, хранящийся в реестре ESP (SP) (архитектура x86). Адреса стеков обычно ниже адресов памяти, потому что стек расположен ближе к началу витруальной памяти, чем кучи.

Другие вопросы по тегам