Я бегу код последующие:как локальная переменная организована в стек при вызове функции?
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
фактом?
Стек обычно растет вниз, причем каждая переменная идет вверх, если она имеет несколько элементов. Конечно, полагаться на то, что это не хорошо. – chris
Я не уверен. Но все же я говорю, что узнаю, ошибаюсь ли я. Ожидается, что ваш массив будет выделен в continguos образом, а не во всех переменных, объявленных в коде. Компилятор будет выделять память для 'i' там, где это возможно –
Фактически, независимо от того, что это на самом деле,' operator <'должен возвращать' true', если адрес элемента ранее в массиве или структуре (с ними с тем же спецификатором доступа) сравнивается с одним позже, так почему бы не сделать это действительно в памяти? Это было бы хорошей причиной для второй части моего первого комментария. Что касается роста вообще, я не заглядывал в это достаточно, чтобы сказать, но это, вероятно, более эффективно или традиционно. – chris