{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
Дереференцирането става в main функцията. Защо мислиш, че това се случва при return? Няма логика. Функцията е дефинирана да връща пойнтър и точно това прави. Предупрежденията, които посочваш, вероятно се появяват защото директно връщаш адрес и компилаторът е достатъчно умен, за да го види.
Прави сте, сори за глупостта която казах - тествах, наистина остава поинтер и ако си направиш watch на пойнтера, той става out of scope като се върне в main. Дори успях да я счупя:
Нещата, мисля, са ясни
О, аз съм наясно, че това няма как да работи.
В крайна сметка извъртях един цикъл с извиквания на printf и се счупи.
Всъщност @а_rusenov ми даде отговора, който търсех.
Счупване със сигурност ще се случи, когато имаме друг код изменящ стека.
Най-сетне се счупи с това: