2014-01-07 3 views
2

Я бегу код последующие:как локальная переменная организована в стек при вызове функции?

void func() 
    { 
     int i; 
     int array[10]; 

     cout << &i << endl; 

     for(int i = 0; i < 10; ++i) 
     { 
      cout << &array[i] << '\n'; 
     } 
    } 

выход является:

0x28fe98 
    0x28fe70 
    0x28fe74 
    0x28fe78 
    0x28fe7c 
    0x28fe80 
    0x28fe84 
    0x28fe88 
    0x28fe8c 
    0x28fe90 
    0x28fe94 

почему адрес i является 0x28fe98?
Я думаю, адрес i должен быть &array[0] - 4.
Почему адрес i является &array[9] + 4 фактом?

+7

Стек обычно растет вниз, причем каждая переменная идет вверх, если она имеет несколько элементов. Конечно, полагаться на то, что это не хорошо. – chris

+0

Я не уверен. Но все же я говорю, что узнаю, ошибаюсь ли я. Ожидается, что ваш массив будет выделен в continguos образом, а не во всех переменных, объявленных в коде. Компилятор будет выделять память для 'i' там, где это возможно –

+0

Фактически, независимо от того, что это на самом деле,' operator <'должен возвращать' true', если адрес элемента ранее в массиве или структуре (с ними с тем же спецификатором доступа) сравнивается с одним позже, так почему бы не сделать это действительно в памяти? Это было бы хорошей причиной для второй части моего первого комментария. Что касается роста вообще, я не заглядывал в это достаточно, чтобы сказать, но это, вероятно, более эффективно или традиционно. – chris

ответ

5

Почему адрес i равен 0x28fe98?

Он расположен сразу после окончания вашего массива

я думаю, что адрес я должен быть & массив [0] - 4.

Почему это должно быть?

Почему адрес i составляет & массив [9] + 4 на самом деле?

Поскольку i после вашего массива :)

Обычно элементы помещаются в стек и их уменьшения в то время Адреса, телефоны предельными кучи увеличивается, но код не должен полагаться на это, за исключением, если вы на низком уровне (asm и т. д.)

+0

Я имею в виду, почему последовательность push не является 'i',' array [0] ', ...,' array [9] '. – stamaimer

+0

@stamaimer, потому что ни один стандарт не говорит, что это должно быть так. И наиболее распространенные реализации делают обратное. AFAIK это просто простой способ отделить кучу от стека и заставить их не сталкиваться, пока не будет использована вся виртуальная память программы. – Drax

+0

спасибо, это полезно. – stamaimer

Смежные вопросы