Форум программистов, компьютерный форум CyberForum.ru

Возвращаемое значение функции - C++

Восстановить пароль Регистрация
 
kotleta
 Аватар для kotleta
42 / 42 / 11
Регистрация: 13.09.2012
Сообщений: 196
13.09.2012, 09:07     Возвращаемое значение функции #1
Здравствуйте
Я тут новенький. Очень трудно у вас проходить регистрацию.

У меня вопрос по С++
Компилятор: Code Blocks

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string.h>
 
using namespace std;
 
int* func() // функция возвращает адрес
{
    int a=347893;
    return &a;
}
 
int main()
{
 // cout << *func();   выведет 347893
 int *p;
 p = func();
 cout << *p; // Почему выводит 347893
 
 return 0;
}
В этом примере есть расхождение между тем, что я знаю (скорее всего я знаю неправильно ), и тем, что выдается на экран.

В функции создается переменная int a, ей присваивается значение. Функция возвращает адрес этой переменной. Дальше происходит выход из блока функции, и локальная переменная int a стирается(?)

В теле main я создаю переменную-указатель p и ей присваиваю то, что вернула функция, т.е. адрес переменной а, но если переменная а по завершению работы функции уничтожилась, и по-хорошему разыменование указателя выдаст какую-нибудь хрень, то почему выводится значение 347893?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
David Sylva
 Аватар для David Sylva
1280 / 942 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
13.09.2012, 10:07     Возвращаемое значение функции #2
Тебе всё правильно выводит программа. Ты указателю p присвоил адрес переменной a, вот он тебе и выводит значение этой переменной.
yekka
384 / 148 / 8
Регистрация: 12.05.2011
Сообщений: 450
13.09.2012, 10:09     Возвращаемое значение функции #3
После того как функция func завершила свою работу, нельзя гарантировать, что область памяти, на которую указывает твой указатель, не будет затерта чем-то другим.
Но точно так же нельзя и гарантировать, что она будет сразу же затерта.
В твоем случае она, очевидно, затереться не успела
kotleta
 Аватар для kotleta
42 / 42 / 11
Регистрация: 13.09.2012
Сообщений: 196
13.09.2012, 10:14  [ТС]     Возвращаемое значение функции #4
yekka, а когда успеет (при каких условиях)? ))

Добавлено через 31 секунду
David Sylva , прочитай пожалуйста, что я под исходным кодом написал
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
13.09.2012, 10:33     Возвращаемое значение функции #5
Цитата Сообщение от kotleta Посмотреть сообщение
а когда успеет (при каких условиях)? ))
Нельзя так делать. Сегодня работает, а завтра - не будет.
kotleta
 Аватар для kotleta
42 / 42 / 11
Регистрация: 13.09.2012
Сообщений: 196
13.09.2012, 11:07  [ТС]     Возвращаемое значение функции #6
PSIAlt, вот вы конкретно ответили на мой вопрос... потому что я помню, я читал, что когда
объект выходит из области видимости (блок {}), то он уничтожается...
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.09.2012, 11:09     Возвращаемое значение функции #7
Цитата Сообщение от kotleta Посмотреть сообщение
yekka, а когда успеет (при каких условиях)? ))
При условии написания собственного менеджера памяти. Но это применимо вообще ко всему :)

Также стоит помнить, что если в функции что-то создаётся динамически (new), то в стеке сохраняется указатель на это что-то. И именно он будет уничтожаться при выходе из функции, тогда как сам созданный объект так и останется в куче. Именно так надо делать, если требуется вынести из функции именно этот объект, а не его копию.
yekka
384 / 148 / 8
Регистрация: 12.05.2011
Сообщений: 450
13.09.2012, 11:27     Возвращаемое значение функции #8
Цитата Сообщение от kotleta Посмотреть сообщение
когда объект выходит из области видимости (блок {}), то он уничтожается...
уничтожается -- значит, вызывается его деструктор. задача деструктора -- освободить ресурсы, захваченные объектом, а не попортить содержимое выделенной под него памяти. зачастую, деструктор вообще ничего не делает, если объект не захватывает никаких ресурсов. Так что его уничтожение подразумевает лишь разрешение использовать память, в которой находился этот объект, для работы других функций.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.09.2012, 11:32     Возвращаемое значение функции
Еще ссылки по теме:

Неправильное возвращаемое значение функции time C++
Как присвоить возвращаемое значение функции переменной? C++
Возвращаемое значение virtual функции C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
warchief
 Аватар для warchief
36 / 36 / 3
Регистрация: 09.08.2012
Сообщений: 114
13.09.2012, 11:32     Возвращаемое значение функции #9
Цитата Сообщение от kotleta Посмотреть сообщение
то он уничтожается...
Не совсем так. Когда происходит выход из блока, выделенная в нем память не уничтожается а помечается как свободная. Но сами то данные никуда не исчезают, они там же и остаются. просто когда ты в следующий раз выделишь память, она будет писаться поверх этих данных. Точно также устроен и жесткий диск, когда ты удаляешь файл, он не удаляется сам. Удаляется только запись об занимаемых адресах из таблицы файловой системы(или как она там, к сожалению забыл)...
Yandex
Объявления
13.09.2012, 11:32     Возвращаемое значение функции
Ответ Создать тему
Опции темы

Текущее время: 18:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru