![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| rainbow86 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 27.10.2005 Репутация: нет Всего: нет |
Можно ли так писать, ведь как я понимаю по выходе из функции все локальные перемменые созданные в ней должны уничтожаться, а мы пытаемся возвратить указатель на переменную? На что будет указывать возвращаемый указатель? Что будет с памятью на которую указывает указатель после отработки функции? Заранее спасибо! |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
у тебя v ни на что не указывает изначально, память нигде не выделяется (судя по коду),
функция возвратит 0 если бы мы выделяли память в ф-ии то она возвращала бы копию переменной v, которая бы содержала адрес первого байта выделенной памяти, сам указатель в ф-ии уничтожается (т. к в стеке)
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Гоганчик |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 5.3.2006 Репутация: нет Всего: нет |
По моему все зависит от реализации компилятора. У меня, например, следующий код
Обработался корректно, т.е. в функции main имеются права не только на чтение, но и на запись по указателю u. Все работает и даже очень хорошо. Я использовал gcc 4.0, и операционную систему Fedora Core 4 |
|||
|
||||
| DeadSoul |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1217 Регистрация: 25.9.2005 Где: Москва Репутация: 2 Всего: 11 |
Гоганчик, за такой код надо отрывать руки. Тебе просто повезло.
rainbow86, какой смысл возврата указателя? Ты хочешь вернуть строку? Тогда лучше используй std::string -------------------- Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". Бьем спамеров их же оружием. Пусть весь спам сыпется им [email protected] |
|||
|
||||
| BreakPointMAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
Гоганчик, а ты литературу по C++ читать пробовал?
Переменная a типа char в твоей функции a является локальной для этой функции, время ее жизни - от точки объявления до конца блока, являющегося телом функции. Переменная создается на стеке и, после отработки функции, уничтожается. Ты же определяешь указатель x типа char*, с помощью операции "&" (операции взятия адреса) заставляешь x ссылаться на адрес, по которому хранится переменная a, и возвращаешь этот адрес в свою главную функцию main. Указатель u типа char* инициализируется адресом, возвращенным функцией a, но по этому адресу в данный момент уже нельзя обращаться, ибо переменная a (локальная переменная для функции a была уничтожена после выхода из функции). Ты же пытаешься разыменовать этот указатель, вывести то, что хранится по этому адресу, и, что еще хуже, изменить это. Если у тебя ничего при этом не заглючило, и никаких Access Violation не было, то это просто чистая случайность и удача... -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
| DeadSoul |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1217 Регистрация: 25.9.2005 Где: Москва Репутация: 2 Всего: 11 |
РАботающая программа - частный случай неопределенного поведения. В его коде "неопределенное поведение" в чистом виде -------------------- Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". Бьем спамеров их же оружием. Пусть весь спам сыпется им [email protected] |
|||
|
||||
| rainbow86 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 27.10.2005 Репутация: нет Всего: нет |
При выделении памяти с помощью malloc или new понятно надо использовать или free или delete. Но если мы не используем эти опреторы а инициализируем указатель например так : char *str="bldfg"; Надо ли заботится об освобождении памяти, после того как функция отработала? |
|||
|
||||
| np9mi7 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
|
|||
|
||||
| BreakPointMAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
Не надо. Указатель str типа char* в данном случае "настраивается" на строковую константу "bldfg", расположенную... гммм... в сегменте данных... ты просто берешь адрес начала строки и записываешь в указатель... память под нее уже выделена... delete и free нужно вызывать только при динамическом выделении памяти. -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
нет -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| BreakPointMAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
MAKCim, посты набираешь? Зачем отвечать на вопрос, на который уже дан ответ двумя участниками форума? И ладно бы, твой ответ дополнял или поправлял уже данные ответы...
-------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |