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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
kotleta
42 / 42 / 11
Регистрация: 13.09.2012
Сообщений: 196
#1

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

13.09.2012, 09:07. Просмотров 832. Ответов 8
Метки нет (Все метки)

Здравствуйте
Я тут новенький. Очень трудно у вас проходить регистрацию.

У меня вопрос по С++
Компилятор: 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?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.09.2012, 09:07     Возвращаемое значение функции
Посмотрите здесь:

Возвращаемое значение функции - C++
array&amp; array::operator = (const array &amp;q) { if (this != &amp;q) { delete s; s=new int; for(len=0;len&lt;q.len;s=q.s,len++) ...

Возвращаемое значение функции - C++
void tokenize(string str_translate){ char char_translate; strcpy(char_translate, str_translate.c_str()); // string to char* ...

Возвращаемое значение функции - C++
Здарвствуйте. Моя задача состоит в написании следующей программы: вычислить среднее арифметическое значение элементов матрицы W(L,L),...

Возвращаемое значение функции - C++
Добрый день. Есть функция: TextString InfoBox::name(unsigned int i) const { if(i&lt;this-&gt;count()) { TextLabel...

Возвращаемое значение virtual функции - C++
В инструкции указанно следующее virtual int getHost() создаю у себя в классе int getHost(){ return ?? }

Возвращаемое значение функции - массив - C++
Здравствуйте, Друзья. Скажите пожалуйста - из функции одномерный массив можно передать в функцию main() или нет? Если да - как. За...

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

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

Также стоит помнить, что если в функции что-то создаётся динамически (new), то в стеке сохраняется указатель на это что-то. И именно он будет уничтожаться при выходе из функции, тогда как сам созданный объект так и останется в куче. Именно так надо делать, если требуется вынести из функции именно этот объект, а не его копию.
yekka
385 / 149 / 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++
что за бардак мне time возвращает??? что типа щас 10 месяц, а год вообще 114 :D пишу так: time_t t; time(&amp;t); tm tt; ...

Как присвоить возвращаемое значение функции переменной? - C++
double sine(int index, int frequency) { return (100*sin(index*frequency)); } вопрос: как присвоить возвращаемое значение...

Шаблон с переменным числом аргументов, и возвращаемое значение функции - C++
Здравствуйте! Использую С++11. Хочу возвращать элементы кортежа пытаюсь так, auto Deserialize(unsigned long long i) -&gt;...

Возвращаемое значение функции - указатель на массив. КАК это записать? - C++
Функция заполняет массив. например (кусок проги) .... int mas; int fun() { заполнила массив


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru