Я беспокоюсь, что неправильно понимаю поведение стека в 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 для компиляции без оптимизации.
То есть те, кто интересуется основами этого вопроса: я готовлю учебные материалы по Си и пытаюсь показать студентам, что им следует не только избегать возврата указателей на автоматические переменные из функций, но и не брать адрес переменных из вложенных блоков и разыменование их снаружи. Я пытался продемонстрировать, как это вызывает проблемы, и не смог получить скриншот.