2015-03-25 3 views
0

Я не могу получить одно: , когда я объявляю переменные (локальные) внутри функции, они выделяются в стеке. Как происходит ссылка? Если я хочу назначить другое значение локальной переменной, нужно ли знать, где именно в стеке находится переменная? Эта информация хранится где угодно?Ссылка на локальную переменную

ответ

2

Предположим, что ваш код выглядит следующим образом:

void main() { 
    int a,b; 
    a = 5; 
    b = 7; 
    printf("%p\n", &a); 
} 

Этот код следует выделить два целых, 'A' и 'B', в стеке. Затем он распечатает адрес «a» и выйдет. Когда main вызывается, стек будет довольно пустым. Немного сгенерированного компилятором кода будет выделять немного пространства в стеке, так что это выглядит следующим образом:

- 'a': Random data 
- 'b': Random data 

Когда вы говорите «а = 5;», вы просто говорите компилятор генерировать некоторый код, который будет «помещать номер 5 в ячейку памяти, которую мы называем« a ». Это место памяти «a» просто находится в стеке, поэтому компилятор помещает 5 в это место в стеке.

  • 'а': 5
  • 'б': Случайные данные

Это в значительной степени то же самое для 'Ъ':

  • 'а': 5
  • 'b': 7

Когда мы получаем ссылку на 'a', мы ge t адрес, который находится в стеке, потому что именно здесь компилятор решил сохранить «a». Если «a» - глобальная переменная, адрес не будет находиться в стеке.

Не то, чтобы вам было нужно заботиться, однако. Компилятор должен позаботиться обо всех этих вещах для вас. Это замечательно в компиляторах C, и поэтому мы их используем. Компилятор C может поместить любые ваши переменные туда, где он хочет, и вам не нужно заботиться. Вы можете просто сказать «Положите 5 в месте, которое мы называем« a »(a = 5;) или« Распечатаем адрес, где вы положили «a» (printf («% p \ n», & a) ;).

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

+0

Кроме того, если вы добавили 'int * addr = & a;' к этой функции, вы объявляете переменную в стеке, которая имеет тип указателя int, это место в памяти будет иметь адрес 'a', хранящийся в нем , – riodoro1

+0

спасибо. когда я делаю это (из вашего примера): a = 5; - адрес «a» в стеке должен быть известен. Интересно, где хранится этот адрес? ну, наверное, мне не нужно знать, что писать код, но я чувствую, что скучаю. – user4709436

+0

Адрес должен быть известен ... компилятору. Вам не нужно знать адрес для установки переменной, но компилятор делает это. Адрес «a» не хранится нигде, но он вычисляется всякий раз, когда это необходимо (не беспокойтесь, это довольно дешевая операция). Если вы хотите получить адрес 'a', вы можете использовать оператор ссылки '&a'; – Xenotoad

3

Вам не нужно заботиться о местоположении переменной в стеке. При компиляции кода компилятор позаботится об этих вещах о том, где будет храниться переменная и как она будет ссылаться.