Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
 Аватар для kotleta
44 / 44 / 17
Регистрация: 13.09.2012
Сообщений: 196

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

13.09.2012, 09:07. Показов 1367. Ответов 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?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.09.2012, 09:07
Ответы с готовыми решениями:

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

Возвращаемое значение функции
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++) ...

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

8
 Аватар для David Sylva
1321 / 983 / 267
Регистрация: 17.05.2012
Сообщений: 2,687
13.09.2012, 10:07
Тебе всё правильно выводит программа. Ты указателю p присвоил адрес переменной a, вот он тебе и выводит значение этой переменной.
0
387 / 151 / 16
Регистрация: 12.05.2011
Сообщений: 450
13.09.2012, 10:09
После того как функция func завершила свою работу, нельзя гарантировать, что область памяти, на которую указывает твой указатель, не будет затерта чем-то другим.
Но точно так же нельзя и гарантировать, что она будет сразу же затерта.
В твоем случае она, очевидно, затереться не успела
1
 Аватар для kotleta
44 / 44 / 17
Регистрация: 13.09.2012
Сообщений: 196
13.09.2012, 10:14  [ТС]
yekka, а когда успеет (при каких условиях)? ))

Добавлено через 31 секунду
David Sylva , прочитай пожалуйста, что я под исходным кодом написал
0
 Аватар для PSIAlt
87 / 87 / 1
Регистрация: 19.06.2012
Сообщений: 245
13.09.2012, 10:33
Цитата Сообщение от kotleta Посмотреть сообщение
а когда успеет (при каких условиях)? ))
Нельзя так делать. Сегодня работает, а завтра - не будет.
1
 Аватар для kotleta
44 / 44 / 17
Регистрация: 13.09.2012
Сообщений: 196
13.09.2012, 11:07  [ТС]
PSIAlt, вот вы конкретно ответили на мой вопрос... потому что я помню, я читал, что когда
объект выходит из области видимости (блок {}), то он уничтожается...
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
13.09.2012, 11:09
Цитата Сообщение от kotleta Посмотреть сообщение
yekka, а когда успеет (при каких условиях)? ))
При условии написания собственного менеджера памяти. Но это применимо вообще ко всему :)

Также стоит помнить, что если в функции что-то создаётся динамически (new), то в стеке сохраняется указатель на это что-то. И именно он будет уничтожаться при выходе из функции, тогда как сам созданный объект так и останется в куче. Именно так надо делать, если требуется вынести из функции именно этот объект, а не его копию.
0
387 / 151 / 16
Регистрация: 12.05.2011
Сообщений: 450
13.09.2012, 11:27
Цитата Сообщение от kotleta Посмотреть сообщение
когда объект выходит из области видимости (блок {}), то он уничтожается...
уничтожается -- значит, вызывается его деструктор. задача деструктора -- освободить ресурсы, захваченные объектом, а не попортить содержимое выделенной под него памяти. зачастую, деструктор вообще ничего не делает, если объект не захватывает никаких ресурсов. Так что его уничтожение подразумевает лишь разрешение использовать память, в которой находился этот объект, для работы других функций.
1
 Аватар для warchief
36 / 36 / 0
Регистрация: 09.08.2012
Сообщений: 132
13.09.2012, 11:32
Цитата Сообщение от kotleta Посмотреть сообщение
то он уничтожается...
Не совсем так. Когда происходит выход из блока, выделенная в нем память не уничтожается а помечается как свободная. Но сами то данные никуда не исчезают, они там же и остаются. просто когда ты в следующий раз выделишь память, она будет писаться поверх этих данных. Точно также устроен и жесткий диск, когда ты удаляешь файл, он не удаляется сам. Удаляется только запись об занимаемых адресах из таблицы файловой системы(или как она там, к сожалению забыл)...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.09.2012, 11:32
Помогаю со студенческими работами здесь

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

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

Неправильное возвращаемое значение функции
Всем привет! Начал программировать на C++ по книге Васильева. Так вот, в первой главе в задаче 15, формулируемой следующим образом:...

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

Неправильное возвращаемое значение функции time
что за бардак мне time возвращает??? что типа щас 10 месяц, а год вообще 114 :D пишу так: time_t t; time(&amp;t); tm tt; ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru