Может ли возвращаемая структура быть перезаписана? - PullRequest
3 голосов
/ 08 апреля 2019

У меня есть структура, возвращаемая некоторой функцией:

struct Abc {
    char *a;
    int b;
};

static struct Abc foo() {
    struct Abc mystruct;
    mystruct.a = "asdf";
    mystruct.b = 1;

    return mystruct;
}

Если я вызываю struct Abc new_abc = foo();, возможно ли, чтобы структура, хранящаяся в new_abc, была перезаписана программой?

Если я правильно понимаю, mystruct - это автоматическая переменная, которая является локальной по объему.Таким образом, ссылка может быть висящей и, следовательно, может быть перезаписана.

1 Ответ

4 голосов
/ 08 апреля 2019

Если я вызываю struct Abc new_abc = foo();, возможно ли, чтобы структура, хранящаяся в new_abc, была перезаписана программой?

Да, new_abc это просто другая переменная.Это может быть перезаписано, если программа (mer) желает этого.

Если я правильно понимаю, mystruct - это автоматическая переменная, которая является локальной по объему.Таким образом, ссылка может быть висящей и, следовательно, может быть перезаписана.

Вы не возвращаете адрес локальной переменной, вы возвращаете значение.Возвращение структурной переменной функционально аналогично возвращению локальной int или char.Здесь нет висящего указателя.


РЕДАКТИРОВАТЬ:

Как поясняется в комментариях:

"будет ли он когда-либо перезаписываться программой, выделяющей память длядругие вещи "

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

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

...