Область действия переменной в стеке в c ++ - PullRequest
0 голосов
/ 19 июня 2020

Привет, я новичок в C ++, и мой вопрос связан с объемом переменной. Позвольте мне задать вопрос, учитывая приведенный ниже код

#include <iostream>

static int* fun(){
  static int *ptr = new int(4);
  return ptr;
}

 static int * tun() noexcept{
   int f = 111;
   *(fun()) = f;
   return fun();
 }

 static int *sun(){
  return tun();
}

int main() {
  std::cout << (*sun()) << std::endl;
}

В средней функции tun() есть переменная с именем f, и когда функция возвращается, она извлекается из стека, насколько мне известно. в этом случае функция возвращается к sun(), которая затем вызывается в main (), а внутри main она дает мне правильное значение переменной decleard и инициализируется в функции tun(). Кто-нибудь может объяснить мне такое поведение, я немного запутался.

Ответы [ 2 ]

2 голосов
/ 19 июня 2020

Переменная f исчезла, но ее значение было сохранено в int, на который указывает указатель, возвращаемый fun. Код можно упростить до

#include <iostream>

int * tun() {
   static int* ptr = new int;
   int f = 111;
   *ptr = f;                  // copy value of f
   return ptr;                  
}                             // f is gone now, but who cares?


int main() {
  std::cout << (*tun()) << std::endl;
}

Непонятно, что код должен делать, кроме обфускации, кстати.

tun () возвращает указатель, указывающий на адрес памяти f, когда tun больше не находится в стеке, разве память не была уничтожена?

Нет. В вашем коде нет указателя на f. Эта строка

*(fun()) = f;

присваивает значение из f переменной int, на которую указывает stati c указатель ptr, возвращаемый fun().

Это похоже на

int x = 0;
int* ptr = new int;
*ptr = x;            // assigns 0 to the int pointed to by ptr
std::cout << *ptr;   // prints 0
assert( ptr != &x);  // adress of x ist not ptr   !!!
1 голос
/ 19 июня 2020

Это происходит потому, что вы присваиваете значение указателю, созданному в куче в fun, переменная f не существует регистратора

  #include <iostream>

static int* fun(){
  static int *ptr = new int(4); // 4 stored inside pointer
  return ptr;
}// ptr still exists because it's heap allocated

 static int * tun() noexcept{
   int f = 111; //f holds value 111
   *(fun()) = f; // ptr now stores the value 111
   return fun();
 } // f gets destroyed, ptr still holds 111

 static int *sun(){
  return tun();
}

int main() {
  std::cout << (*sun()) << std::endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...