Я беспокоюсь, что я неправильно понимаю что-то о поведении стека в C.
Предположим, что у меня есть следующий код:
int main (int argc, const char * argv[])
{
int a = 20, b = 25;
{
int temp1;
printf("&temp1 is %ld\n" , &temp1);
}
{
int temp2;
printf("&temp2 is %ld\n" , &temp2);
}
return 0;
}
Почему я не получаю один и тот же адрес в обеих распечатках? Я получаю, что temp2 находится в одном int от temp1, как если бы temp1 никогда не перерабатывался.
Мое ожидание заключается в том, что стек содержит 20 и 25. Затем установите temp1 сверху, затем удалите его, затем установите temp2 сверху, затем удалите его.
Я использую gcc в Mac OS X.
Обратите внимание, что я использую флаг -O0 для компиляции без оптимизации.
Те, кто интересуется предпосылкой для этого вопроса: я готовлю учебные материалы на C, и я пытаюсь показать учащимся, что они должны не только избегать обращения указателей к автоматическим переменным от функций, но и избегать использования адреса переменных из вложенных блоков и разыменование их снаружи. Я пытался показать, как это вызывает проблемы, и не может получить скриншот.