Назначен ли примитиву адрес памяти? - PullRequest
6 голосов
/ 25 ноября 2008

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

  1. int i;
  2. i = 3;

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

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

Обновление:

Относительно ответов:

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

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

Ответы [ 4 ]

5 голосов
/ 25 ноября 2008

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

add $2, $0, 3

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

1 голос
/ 25 ноября 2008

Если вы говорите о 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
0 голосов
/ 24 января 2011

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

0 голосов
/ 25 ноября 2008

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

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