Подтвердить что ты не робот

Безопасно ли держать указатель на переменную из области видимости?

Пример кода:

#include <stdio.h>
int main (){
    int *p;
    {
        int v = 1;
        p = &v;
    }
    printf("%d\n", *p);
    return 0;
}

Этот код работает нормально, но я не уверен, есть ли гарантия сохранения адреса v.

4b9b3361

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

i даст u пример

взгляните на это. http://www.functionx.com/cpp/examples/returnreference.htm

здесь он пытается вернуть ссылку переменной, которая выходит за рамки... (Большая ошибка).. но она работает....

u не могу гарантировать... Так что лучше (лучше не лучше) никогда не возвращать ссылку на данные, выходящие за рамки