Безопасно ли держать указатель на переменную из области видимости?
Пример кода:
#include <stdio.h>
int main (){
int *p;
{
int v = 1;
p = &v;
}
printf("%d\n", *p);
return 0;
}
Этот код работает нормально, но я не уверен, есть ли гарантия сохранения адреса v.
Ответ 1
Нет гарантии.
Как только v выходит за пределы области видимости, что-то с ним вообще (даже с помощью указателя) считается Undefined Behavior.
Как и в случае любого другого поведения undefined, только потому, что он работает в одной операционной системе, компилятор, версия компилятора, время суток и т.д., не означает, что он будет работать для другого.
Ответ 2
Чтобы добавить ответ Merlyn, в одном случае, когда это, вероятно, приведет к поведению, которое вы не намеревались, следующее:
#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", и что-то совершенно другое, в зависимости от того, какой компилятор и настройки используются.
Ответ 3
ya он будет работать иногда, но нельзя быть уверенным, что он работает... Иногда это не только вызывает
ошибка шины, но даже может привести к сбою всей программы...