C стек / область видимости, время жизни переменной после завершения функции - PullRequest
4 голосов
/ 20 апреля 2010
void someFunc()
{
    int stackInt = 4;

    someOtherFunc(&stackInt);
}

Является ли это случаем, что адресное пространство stackInt может быть перераспределено после того, как someFunc заканчивается, что делает небезопасным предположение, что значение, переданное someOtherFunc, представляет переменную stackInt со значением 4, которое было передано ему? Другими словами, следует ли мне избегать передачи переменных стека по адресу и ожидать, что они будут оставаться живыми после завершения функции, в которой они были инициализированы?

Ответы [ 4 ]

3 голосов
/ 20 апреля 2010

Да, определенно.

Вы не должны избегать передачи переменных, выделенных в стеке, по ссылке / указателю, однако, просто хранит указатели или ссылки на переменные, выделенные из стека.

1 голос
/ 20 апреля 2010

После того, как someFunc() вернется и будет вызвана другая функция, пробел, использованный для stackInt, будет использован для некоторой другой переменной в новой функции. Следовательно, функция someOtherFunc() не может безопасно предполагать, что, если она сохранит копию указателя, она будет передана, этот указатель останется действительным. Если он хранит копию значения, на которое было указано, это нормально.

Итак, хотя можно передавать переменные стека по адресу (например, someOtherFunc() может изменить значение stackInt и, если в someFunc() есть код, который получил к нему доступ после вызова, значение может быть не равно 4), небезопасно хранить указатель и ожидать, что он будет указывать на любое действительное значение после возврата someFunc().

0 голосов
/ 20 апреля 2010

До тех пор, пока вы не создадите новый поток из someOtherFunc и не используете там stackInt, это будет работать.

0 голосов
/ 20 апреля 2010
  1. Абсолютно нормально передавать переменные стека в качестве параметров всеми возможными способами
  2. Переменные, выделенные стеком, будут перезаписаны, только когда функция, объявляющая эти переменные, завершит свое выполнение.

Так что, пока вы не вернетесь из функции someFunc (), stackInt не повредит.

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