{HOMEWORK]Как така работи ?
Здравейте :)
Пиша си аз пета задача със следния код. Очаквах да има проблем с върнатия указател към локланата променлива на функцията обаче си работи нормално независмо, че не е safe :)
/*
* File: create_new_int.c
* Author: mdv
*Write a function that declares and initializes and integer on the stack, then returning it. Try creating the function
with two different declarations:
* Created on October 26, 2015, 7:48 PM
*/
#include <stdio.h>
int new_integer();
int* new_integer_ptr();
int main() {
int good_var = new_integer();
printf("Good var is %d\n",good_var);
int* bad_var = new_integer_ptr();
printf("Bad var is %d\n",(*bad_var));
return 0;
}
int new_integer() {
int stack_var = 1000;
return stack_var; // here I return copy of local stack var; It's safe
// Now original stack_var is dead
}
int* new_integer_ptr() {
int stack_var = 1000;
int* stack_ptr = &stack_var;
return stack_ptr; // Really bad ! Because now stack_var wil be dead so stack_ptr points to garbage
//It's NOT safe
}
Output-ът е
Good var is 1000
Bad var is 1000
RUN FINISHED; exit value 0; real time: 0ms; user: 0ms; system: 0ms
В допълнение на казаното: преди връщането стекът ти изглежда по следния начин:
| |
| new_integer_ptr | < - - result
| main |
----------------------------
При връщане на резултат new_integer_ptr() се премахва от стека, но въпреки това паметта, която е заемала фунцията, не се затрива - просто вече е невалидна. Върнатият указател обаче продължава да сочи към тази памет и затова програмата се изпълнява правилно.
Пробвай обаче преди да принтираш резултата, да извикаш printf() или някоя фукнция за нещо друго и виж какво ще стане. :)