Чтобы добавить ответ Мерлина, один из случаев, когда это, вероятно, приведет к поведению, которое вы не предполагали, заключается в следующем:
#include <stdio.h>
int main (){
int *p;
{
int v = 1;
p = &v;
}
{
int w = 2;
printf("%d\n", w);
}
printf("%d\n", *p);
return 0;
}
Компилятор может оптимизировать это, имея v
и w
делить то же самое распределение в стеке.Опять же, компилятор может также не оптимизировать это - поэтому поведение использования указателей на переменные после окончания их вмещающего блока не определено.Программа может выводить «2» и «1», или «2» и «2», или «2» и что-то совершенно другое в зависимости от того, какой компилятор и настройки используются.