Назначен ли примитиву адрес памяти?
Я пытаюсь понять процесс объявления и присвоения примитивного типа на заднем этапе.
int i;
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). Адреса стеков обычно ниже адресов памяти, потому что стек расположен ближе к началу витруальной памяти, чем кучи.