![]() |
|
Модераторы: bsa |
![]()
|
|
| GQU |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 13.2.2011 Репутация: нет Всего: нет |
почему нельзя возвращать указатель, а локальную переменную можно?
|
|||
|
||||
| Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 5 Всего: 32 |
Потому что локальные переменные лежат на стеке, который сбрасывается при выходе из функции. Дальше другие функции будут использовать ту же память для своего стека.
-------------------- ![]() |
|||
|
||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Ровно наоборот. Если в функции была выделена память (операторами new или new[]), и возвращён указатель на неё, то после завершения функции эта память "останется в живых", и скопировав возвращённый указатель, можно добраться до неё. Разумеется, выделенное надо будет потом где-нить освободить. А если попытаться возвратить временную переменную, созданную на стеке функции, то после возврата из этой функции стек будет уничтожен, и что там окажется в этой переменной -- никто не знает. Может, корректные данные, а может быть и мусор.
|
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Нельзя возвращать указатель или ссылку на локальную переменную.
Можно возвращать указатель на выделенную память (операторами new или new[]). Можно возвращать указатель или ссылку на static переменную. Можно возвращать указатель или ссылку, переданные в качестве параметра (но не всегда) Можно возвращать локальную переменную или поле класса. Результат будет скопирован в соответствующую переменную вызывающей функции (при необходимости будет вызван оператор или конструктор копирования). |
|||
|
||||
| Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 5 Всего: 32 |
Нет, не наоборот. Когда возвращаешь переменную, то она копируется. Указатель, собственно, тоже копируется, но остаётся указателем на переменную в стеке, которая перетрётся при первой возможности. Конечно же можно вернуть указатель на нестековую переменную или на данные, переданные в аргументах по указателю или ссылке. -------------------- ![]() |
|||
|
||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
В общем, всё, что лежит на стеке функции -- не возвращать (через указатель ли, через ссылку). Копии лежащего на стеке функции возвращать можно, указатели на динамически выделенную в теле функции память возвращать можно. Теперь осталось рассказать, что такое "стек функции", и как он функционирует. |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Не нужно знать, как устроен стек. он может быть устроен по-разному на разных процессорах.
Нужно только иметь ввиду, что локальных переменных после выхода из функции, больше не существует. |
|||
|
||||
| GQU |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 13.2.2011 Репутация: нет Всего: нет |
Спасибо всем, разобрался вроде
попробуй перетри
Это сообщение отредактировал(а) GQU - 13.8.2014, 19:27 |
||||
|
|||||
| Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 5 Всего: 32 |
http://codepad.org/DudxDuRw -------------------- ![]() |
|||
|
||||
| GQU |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 13.2.2011 Репутация: нет Всего: нет |
на строке
ошибка error C2440: return: невозможно преобразовать "volatile int *" в "int *" Это сообщение отредактировал(а) GQU - 13.8.2014, 20:11 |
|||
|
||||
| Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 5 Всего: 32 |
gcc прожевал. Попробуй убрать volatile. -------------------- ![]() |
|||
|
||||
| GQU |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 13.2.2011 Репутация: нет Всего: нет |
ну я убрал, все норм, сейчас разбираюсь со стеком, почему в моем случае не перетерает, просто я неправильно представляю пока еще как работает стек понял, у меня не затирается, потому что переменные создаются, уничтожаются, (при выходе из функции), адрес, на который ссылается локальная переменная остается тот же просто я думал, что новые переменные перетрут данные, на которые ссылается указатель p, а нет, return-а то еще не было, указатель стека не сместился Это сообщение отредактировал(а) GQU - 13.8.2014, 21:08 |
|||
|
||||
| math64 |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
А ты не полагайся на случай - просто так не делай. Вот так можно:
Вот так тоже можно:
но результат можно сохранять только пока существуют переменные, указанные в вызове tmp. |
||||||
|
|||||||
| EnergoHokum |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Потому что затирание будет зависеть от погоды на Марсе, фазы Луны, заданных опций оптимизации компилятора, и ещё тонны факторов, которые не учесть. Потому, во избежание, надо считать, что переменные, размещённые на нём, после завершения работы функции "сломаны".
Если дружишь с english language, то вот. Если не дружишь -- срочно начинай дружить. Хорошей литературы на русском исчезающе мало. |
||||
|
|||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
||||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |