0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 6
|
|||||||||||
1 | |||||||||||
Что такое int*23.01.2013, 15:44. Показов 70820. Ответов 21
Метки нет (Все метки)
Если с этим
0
|
23.01.2013, 15:44 | |
Ответы с готовыми решениями:
21
Что это такое int (*func4 (void)(int) Что такое int*a ? что такое возможности типа Int? Что значит такое объявление typedef int (*A) ( )? |
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 6
|
|
23.01.2013, 15:53 [ТС] | 3 |
UserAK, приношу извинения, я писал сообщение побольше этого, но когда нажал отправить, то выкинуло из акаунта, а когда вошел, то выскочила ошибка форума, что я использваол русские и английские слвоа месте, а когда нажал под ошибкой на кнопку назад, то в сообщение не возвращалось, а шла переадресация на эту ошибку, ну а вернутся на само написание сообщения в браузере через стрелочки назад, не смог, так как в ie9 почему то не сохраняется буфер сообщений, которые были на предыдущих страницах открытых в барузере в той же вкладке в отлчии от google chrome. Ну а когда вошел и начал писать заного, то каким то хоткеем случайно создал преждевременно тему. Ну и начал побыстрому редактировать хоть что-то.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
23.01.2013, 15:58 | 5 |
0
|
Мой лучший друг-отладчик!
|
|
23.01.2013, 16:04 | 7 |
lepufuxa, int * в обьявлении на функции указывает нам на то, что функция f возвращает указатель на int.У вас возвращается адрес локальной переменной., которая после выхода из функции уничтожается.Значит указатель будет указывать на ни на что.И если вы потом попытаетесь менять по этому указателю переменную, вам выкинет ошибку.
1
|
Неэпический
|
|
23.01.2013, 16:08 | 8 |
"освобождается"
на тот же участок памяти и если он не перезаписан еще, то там будет значение x, но надеяться на это не очень хорошо.
0
|
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 6
|
|
23.01.2013, 20:22 [ТС] | 9 |
Этот код был для примера и то что после выхода освобождается понятно. Я имел ввиду каким образом и в каком виде это передается, то есть что и куда будет передаватся через инструкцию return. Ну вот если бы у функции был возвращаемый тип int без указателя, то при вызове функции вернулось бы какое-то число, а если тип с указателем, то return передает адресс, но а что дальше происходит с этим адрессом? Лучше на примере копирования массива через operator=
0
|
Форумчанин
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|
23.01.2013, 21:13 | 10 |
ага, и не забудьте потом освободить. А ведь наверняка где-нибудь, да программист с руками с одного места, или просто рассеянный, забудет так сделать. Избегайте выделения памяти в куче внутри функции т.к. понадеяться, на то, что программист знает функцию и что он не забудет освободить память просто нельзя (а это лишь в этой программе одна функция, а представьте, что будет в проекте?) Нет, так делать нельзя.
0
|
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 6
|
|
23.01.2013, 22:01 [ТС] | 11 |
MrGluck, страно это слышать от человека с 717 плюсами в репутации
0
|
23.01.2013, 22:20 | 12 | |||||
а я наоборот плюсану. Если есть такая возможность, то пусть функция принимает в качестве аргумента указатель на выделенную память, в которую будет записывать то, что собирается вернуть.
а когда и каким образом освобождать. может память внутри функции выделялась через malloc??? А может предоставлялась каким-нибудь менеджером памяти? Как я буду гадать, как её освободить, не вникая в тело функции fill?
0
|
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 6
|
|
23.01.2013, 22:35 [ТС] | 13 |
Kuzia domovenok, я же не спорю, но это так категорично звучало, что даже множество больших объектов выделяемых внутри функции, должны были сказать "okay" и начать крашить стек. И безрукость или невнимательность программистов - это не аргумент для отказа от использования кучи внутри функций, так как вся эта "безрукость и невнимательность" - как минимум нежелание в чем либо разбиратся, что может вызвать куда больше проблем, чем шанс не уследить за утечкой памяти. Вообщем, это все оффтоп. На главный вопрос тут так и не ответили, а начали искать что-то в коде, который был для примера.
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
||||||
23.01.2013, 22:56 | 14 | |||||
фиг вам
она остается в памяти никто её специально уничтожать не собирается просто память получает статус свободной и любая стерлядь может туда записать что угодно но указатель то валидный а значения могут быть любые вот это правильней ибо сам БиллГейтс не сможет гарантировать что в этой памяти лежит но если знать эти подводные камни можно написать програмки которые будут работать Добавлено через 9 минут а что так не бывает? выдели на стеке массив на миллиард интов А кто то предлагал отказаться Представь что тебе дали либу, которую написал горе-программист и не документировал там такая функция
удалять или нет ??
0
|
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 6
|
|
23.01.2013, 23:27 [ТС] | 15 |
Ну так это был сарказм...
Просто выделить? Ой лол. Да, соглашайся. Так получается, что "горе-программист" не только написал либу, а ещё и дал её?
0
|
Форумчанин
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|
23.01.2013, 23:35 | 17 |
lepufuxa, вы на форум пришли нас учить?
Почитайте книги, наберитесь опыта, тогда, надеюсь, дискуссия будет поинтересней. Аргументы появятся весомые, а пока это как в воду пукнуть. Считаю, что ответ был дан: P.S. репа на форуме - это просто цифры, они знаний не отражают, читайте посты и вникайте в суть, а не оценивайте карму.
0
|
24.01.2013, 12:38 | 18 |
изначально так был вопрос сформулирован, что тут поделать?
может класс хранит все указатели и вообще под этим указателем может что угодно в итоге скрываться Добавлено через 14 минут и ведь когда-то она уничтожится? и явно если это будет не внутри функции то после выхода из функции можно придираться к словам сколько угодно, только сути это не меняет, стековая переменная, созданная внутри функции, после выхода из функции по логике программы не существует.
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
||||||||||||||||
24.01.2013, 13:17 | 19 | |||||||||||||||
я попытаюсь объяснить на пальцах
под переменную x допустим она лежит по адресу 100 функция вернула 100 адрес переменной х m стала равна 100 адрес валидный а вот что лежит по этому адресу? может 2( если никто не посягнул на эту память) а может и нет, никто не гарантирует Это как в файловой системе когда удаляешь файл удаляется запись ссылки на этот файл и сектора помечаются как свободные, но сами сектора никто не переписывает и можно восстановить файл, до тех пор пока другая программа решившая что то записать на диск и увидев пустой сектор не записала свои данные переменная не существует а ссылка на её местоположение существует это как в нормальном программировании так делать нельзя а вот в хакерском нередко используют например вернуть несколько значений (но это сильно платформенно зависимо) Добавлено через 19 минут она не уничтожается, а объявляется свободной вот маленький примерчик
но если написать так
хотя сам указатель продолжает оставаться валидным ( иначе бы вылетела ошибка доступа к памяти)
0
|
24.01.2013, 13:44 | 20 |
это адрес объявляется свободным, то есть это уже не int* а void*, а переменной больше не существует. она осталась там внутри функции. а вот указатель на переменную в куче так и останется int*
Добавлено через 6 минут я не знаю какие бывают операционные системы и как может повести себя программа под их управлением, может это виртуальная машина, запущенная на глючном компе, может приложение вместе со всем своим барахлом постоянно переезжает из одной области памяти в другую. а может я не так понял вопрос. имхо вопрос был про правомерность считать возвращаемый указатель указателем на int. Добавлено через 11 минут переменная это же всё-таки абстрактное понятие, ну не знаю как грамотно выразить мысль - данные в контексте методов работы с ними, если есть данные в памяти но они выдернуты из контекста, это уже не переменная, а непонятно что. то есть в таком ракурсе вполне можно считать, что жизненный цикл переменной закончен - переменная уничтожена. нету её больше. это уже не она (как в фильмах ужасов) остался только безжизненный трупик где-то в стеке
1
|
24.01.2013, 13:44 | |
24.01.2013, 13:44 | |
Помогаю со студенческими работами здесь
20
что такое int argc, char *argv[] в качестве параметров главной (main) функции? Что означает ошибка too few arguments to function ‘int my_func(int, int)’ (язык C++)? Что такое "volatile int" Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |