zwracanie referencji to zmiennej lokalnej

0

jak ucza, zmienne lokalne sa kasowane zaraz po wyjsciu z funkcji. tak wiec rozwazmy takowy kod:

int & suma(int a, int b)
{
  int c;
  c = a + b;
  return c;
};

void main()
{
  int wynik = suma( 5, 3 );
};

No i wynik jest 8. Niektore kompilatory podomno tego nie skompiluja, inne wywala ostrzezenie jak w temacie. Z czego to wynika ? Bo jak sie domyslam, ostrzezenie kompilatora to znaczy ze cos sie raczej uda ale moze byc i tak ze sie wysypie. W delphi wywali jakies warning czy przechodzi to bez problemu?

0

Zmienne lokalne tworzone są na stosie. Co do zasady polega to jednak wyłącznie na odpowiednim przesunięciu wskaźnika stosu, bez ingerencji w wartości zapisane. Po wyjściu z procedury przez jakiś czas (aż nie zostanie nadpisana) na stosie nadal pozostanie prawidłowa wartość zmiennej...

Zapewne o to właśnie chodzi...

0

W Delphi podejście jest inne, ponieważ nie wskazujesz, co zwracasz (kod powyżej: return c;), ale masz po prostu zarezerwowaną zmienną określonego typu (result := c;, alternatywnie NazwaAktualnejFunkcji := c;), przez którą przekazujesz zwracaną wartość.

Jeśli zmienna ta jest typu wskaźnikowego, możesz zwrócić adres zmiennej lokalnej (zmienna po wywołaniu nie jest aktualna, ale adres jak najbardziej), w przeciwnym razie możesz zwrócić wartość. Zatem nie istnieje problem zwracania referencji do zmiennej lokalnej. Przez referencję możesz podać parametry funkcji, ale nie może zwrócić wyniku przez referencję.

Jak wspomniał przedmówca, póki pamięć po zmiennej lokalnej nie zostanie nadpisana, utrzymuje stałą wartość, ale nie należy z niej korzystać (bo nie masz pewności co do aktualności).

0
int wynik = suma( 5, 3 );

W takim przypadku nie ma ryzyka

zrób tak:

int &wynik = suma( 5, 3 );
int x = suma(6,9);

int z = wynik;

teraz sprawdź czy z = 8.

1 użytkowników online, w tym zalogowanych: 0, gości: 1