Безопасно ли держать указатель на переменную вне области видимости? - PullRequest
12 голосов
/ 27 декабря 2010

Пример кода:

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

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

Ответы [ 3 ]

25 голосов
/ 27 декабря 2010

гарантии нет.

Как только v выходит из области видимости, все что-либо с ним делается (даже через указатель) считается неопределенным поведением .

Как и в случае любого другого неопределенного поведения, то, что оно работает в одной операционной системе, компиляторе, версии компилятора, времени суток и т. Д., Не означает, что оно будет работать для другой.

8 голосов
/ 27 декабря 2010

Чтобы добавить ответ Мерлина, один из случаев, когда это, вероятно, приведет к поведению, которое вы не предполагали, заключается в следующем:

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

0 голосов
/ 28 августа 2012

да, иногда это будет работать, но нельзя быть уверенным, что это работает ... Иногда это не только вызывает ошибку шины, но даже может привести к сбою всей программы ...

я приведу пример

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...