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

Что такое int* - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.67
lepufuxa
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 6
23.01.2013, 15:44     Что такое int* #1
Если с этим
C++
1
int a=3,*p = &a;
понятно, то есть переменная "p" содержит адресс переменной "a" и указывает на тип int, то с этим не очень понятно
C++
1
int* f(){int x=2;return &x}
Что происходит в случаее с функцией? Где содержится адресс переменной "x", который возвращает иструкция "return &x"? Ведь есть только "int*, а адресс где хранить? Я что-то упускаю, но не пойму.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
UserAK
70 / 70 / 4
Регистрация: 25.12.2012
Сообщений: 189
Записей в блоге: 2
23.01.2013, 15:49     Что такое int* #2
Цитата Сообщение от lepufuxa Посмотреть сообщение
int* f(){int x=2;return &p}
а что такое р ?

Добавлено через 2 минуты
а понял, это переменная типа int глобальная или может член класса-владельца функции
lepufuxa
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 6
23.01.2013, 15:53  [ТС]     Что такое int* #3
UserAK, приношу извинения, я писал сообщение побольше этого, но когда нажал отправить, то выкинуло из акаунта, а когда вошел, то выскочила ошибка форума, что я использваол русские и английские слвоа месте, а когда нажал под ошибкой на кнопку назад, то в сообщение не возвращалось, а шла переадресация на эту ошибку, ну а вернутся на само написание сообщения в браузере через стрелочки назад, не смог, так как в ie9 почему то не сохраняется буфер сообщений, которые были на предыдущих страницах открытых в барузере в той же вкладке в отлчии от google chrome. Ну а когда вошел и начал писать заного, то каким то хоткеем случайно создал преждевременно тему. Ну и начал побыстрому редактировать хоть что-то.
UserAK
70 / 70 / 4
Регистрация: 25.12.2012
Сообщений: 189
Записей в блоге: 2
23.01.2013, 15:53     Что такое int* #4
x - локальная стековая переменная, и она уничтожается после выхода из функции, т.е. адрес указывает не известно на что
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.01.2013, 15:58     Что такое int* #5
Цитата Сообщение от lepufuxa Посмотреть сообщение
Что происходит в случаее с функцией? Где содержится адресс переменной "x", который возвращает иструкция "return &x"?
Нельзя возвращать адреса локальных объектов.
UserAK
70 / 70 / 4
Регистрация: 25.12.2012
Сообщений: 189
Записей в блоге: 2
23.01.2013, 15:58     Что такое int* #6
Цитата Сообщение от lepufuxa Посмотреть сообщение
int* f(){int x=2;return &x}
если хотите, что бы переменная была доступна после выхода из функции, то разместите её в куче, а не в стеке:
C++
1
int* f(){int *x=new int(2);return x;}
ZaMaZaN4iK
Мой лучший друг-отладчик!
 Аватар для ZaMaZaN4iK
163 / 163 / 9
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
23.01.2013, 16:04     Что такое int* #7
lepufuxa, int * в обьявлении на функции указывает нам на то, что функция f возвращает указатель на int.У вас возвращается адрес локальной переменной., которая после выхода из функции уничтожается.Значит указатель будет указывать на ни на что.И если вы потом попытаетесь менять по этому указателю переменную, вам выкинет ошибку.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
23.01.2013, 16:08     Что такое int* #8
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
которая после выхода из функции уничтожается.
"освобождается"
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
Значит указатель будет указывать на ни на что.
на тот же участок памяти и если он не перезаписан еще, то там будет значение x, но надеяться на это не очень хорошо.
lepufuxa
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 6
23.01.2013, 20:22  [ТС]     Что такое int* #9
Этот код был для примера и то что после выхода освобождается понятно. Я имел ввиду каким образом и в каком виде это передается, то есть что и куда будет передаватся через инструкцию return. Ну вот если бы у функции был возвращаемый тип int без указателя, то при вызове функции вернулось бы какое-то число, а если тип с указателем, то return передает адресс, но а что дальше происходит с этим адрессом? Лучше на примере копирования массива через operator=
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,405
23.01.2013, 21:13     Что такое int* #10
Цитата Сообщение от UserAK Посмотреть сообщение
если хотите, что бы переменная была доступна после выхода из функции, то разместите её в куче, а не в стеке:
C++
1
int* f(){int *x=new int(2);return x;}
ага, и не забудьте потом освободить. А ведь наверняка где-нибудь, да программист с руками с одного места, или просто рассеянный, забудет так сделать. Избегайте выделения памяти в куче внутри функции т.к. понадеяться, на то, что программист знает функцию и что он не забудет освободить память просто нельзя (а это лишь в этой программе одна функция, а представьте, что будет в проекте?) Нет, так делать нельзя.
lepufuxa
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 6
23.01.2013, 22:01  [ТС]     Что такое int* #11
MrGluck, страно это слышать от человека с 717 плюсами в репутации
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
23.01.2013, 22:20     Что такое int* #12
Цитата Сообщение от lepufuxa Посмотреть сообщение
MrGluck, страно это слышать от человека с 717 плюсами в репутации
а я наоборот плюсану. Если есть такая возможность, то пусть функция принимает в качестве аргумента указатель на выделенную память, в которую будет записывать то, что собирается вернуть.
C++
1
2
3
4
5
6
7
8
9
void fill(int* buffer, int size){
  /// так лучше, чем...
}
 
int* fill(int size){
  int* buffer=new int[size];
  ///...чем так
  return buffer;
}
тот кто вызывает функцию лучше знает, когда и каким образом выделять память,
а когда и каким образом освобождать.
может память внутри функции выделялась через malloc??? А может предоставлялась каким-нибудь менеджером памяти? Как я буду гадать, как её освободить, не вникая в тело функции fill?
lepufuxa
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 6
23.01.2013, 22:35  [ТС]     Что такое int* #13
Kuzia domovenok, я же не спорю, но это так категорично звучало, что даже множество больших объектов выделяемых внутри функции, должны были сказать "okay" и начать крашить стек. И безрукость или невнимательность программистов - это не аргумент для отказа от использования кучи внутри функций, так как вся эта "безрукость и невнимательность" - как минимум нежелание в чем либо разбиратся, что может вызвать куда больше проблем, чем шанс не уследить за утечкой памяти. Вообщем, это все оффтоп. На главный вопрос тут так и не ответили, а начали искать что-то в коде, который был для примера.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
23.01.2013, 22:56     Что такое int* #14
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
У вас возвращается адрес локальной переменной., которая после выхода из функции уничтожается.
фиг вам
она остается в памяти никто её специально уничтожать не собирается
просто память получает статус свободной и любая стерлядь может туда записать что угодно
но указатель то валидный а значения могут быть любые
Цитата Сообщение от Croessmah Посмотреть сообщение
"освобождается"
вот это правильней ибо сам БиллГейтс не сможет гарантировать что в этой памяти лежит
но если знать эти подводные камни можно написать програмки которые будут работать

Добавлено через 9 минут
Цитата Сообщение от lepufuxa Посмотреть сообщение
о это так категорично звучало, что даже множество больших объектов выделяемых внутри функции, должны были сказать "okay" и начать крашить стек.
а что так не бывает?
выдели на стеке массив на миллиард интов

Цитата Сообщение от lepufuxa Посмотреть сообщение
И безрукость или невнимательность программистов - это не аргумент для отказа от использования кучи внутри функций,
А кто то предлагал отказаться

Цитата Сообщение от lepufuxa Посмотреть сообщение
как минимум нежелание в чем либо разбиратся, что может вызвать куда больше проблем, чем шанс не уследить за утечкой памяти.
Представь что тебе дали либу, которую написал горе-программист и не документировал
там такая функция
C++
1
myClass* MyGet();
и как ты разберешься что вернули указатель на действующий класс или выделили память с нуля
удалять или нет ??
lepufuxa
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 6
23.01.2013, 23:27  [ТС]     Что такое int* #15
Цитата Сообщение от ValeryS Посмотреть сообщение
а что так не бывает?
выдели на стеке массив на миллиард интов
Ну так это был сарказм...

Цитата Сообщение от ValeryS Посмотреть сообщение
а что так не бывает?
выдели на стеке массив на миллиард интов
Просто выделить? Ой лол.
Цитата Сообщение от ValeryS Посмотреть сообщение
А кто то предлагал отказаться
Да, соглашайся.

Цитата Сообщение от ValeryS Посмотреть сообщение
и как ты разберешься что вернули указатель на действующий класс или выделили память с нуля
удалять или нет ??
Так получается, что "горе-программист" не только написал либу, а ещё и дал её?
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
23.01.2013, 23:34     Что такое int* #16
lepufuxa,
ладно продолжай выделять память в одном блоке уничтожать в другом можешь даже в разных единицах трансляции
Правило "Кто выделил память тот её и уничтожает" тебе видать претит
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,405
23.01.2013, 23:35     Что такое int* #17
lepufuxa, вы на форум пришли нас учить?
Почитайте книги, наберитесь опыта, тогда, надеюсь, дискуссия будет поинтересней. Аргументы появятся весомые, а пока это как в воду пукнуть.
Считаю, что ответ был дан:
Цитата Сообщение от ValeryS Посмотреть сообщение
фиг вам
она остается в памяти никто её специально уничтожать не собирается
просто память получает статус свободной и любая стерлядь может туда записать что угодно
но указатель то валидный а значения могут быть любые
P.S. репа на форуме - это просто цифры, они знаний не отражают, читайте посты и вникайте в суть, а не оценивайте карму.
UserAK
70 / 70 / 4
Регистрация: 25.12.2012
Сообщений: 189
Записей в блоге: 2
24.01.2013, 12:38     Что такое int* #18
Цитата Сообщение от ValeryS Посмотреть сообщение
lepufuxa,
ладно продолжай выделять память в одном блоке уничтожать в другом можешь даже в разных единицах трансляции
Правило "Кто выделил память тот её и уничтожает" тебе видать претит
изначально так был вопрос сформулирован, что тут поделать?
может класс хранит все указатели и вообще под этим указателем может что угодно в итоге скрываться

Добавлено через 14 минут
Цитата Сообщение от Croessmah Посмотреть сообщение
Сообщение от ZaMaZaN4iK Посмотреть сообщение
которая после выхода из функции уничтожается.
и ведь когда-то она уничтожится? и явно если это будет не внутри функции то после выхода из функции
можно придираться к словам сколько угодно, только сути это не меняет, стековая переменная, созданная внутри функции, после выхода из функции по логике программы не существует.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
24.01.2013, 13:17     Что такое int* #19
Цитата Сообщение от UserAK Посмотреть сообщение
может класс хранит все указатели и вообще под этим указателем может что угодно в итоге скрываться
я попытаюсь объяснить на пальцах
C++
1
2
3
4
5
6
int* f()
{int x=2;
return &x;
}
......................................
int *m=f();
в функции выделили память
под переменную x допустим она лежит по адресу 100
функция вернула 100 адрес переменной х
m стала равна 100 адрес валидный
а вот что лежит по этому адресу? может 2( если никто не посягнул на эту память) а может и нет, никто не гарантирует
Это как в файловой системе когда удаляешь файл удаляется запись ссылки на этот файл и сектора помечаются как свободные, но сами сектора никто не переписывает и можно восстановить файл, до тех пор пока другая программа решившая что то записать на диск и увидев пустой сектор не записала свои данные

Цитата Сообщение от UserAK Посмотреть сообщение
стековая переменная, созданная внутри функции, после выхода из функции по логике программы не существует.
переменная не существует а ссылка на её местоположение существует
это как
Незнание закона не освобождает от ответственности. А вот знание нередко освобождает.
(с)Е. Лец

в нормальном программировании так делать нельзя а вот в хакерском нередко используют например вернуть несколько значений (но это сильно платформенно зависимо)

Добавлено через 19 минут
Цитата Сообщение от UserAK Посмотреть сообщение
и ведь когда-то она уничтожится?
она не уничтожается, а объявляется свободной

вот маленький примерчик
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int* func()
{
 int a[10];
 for(int i=0;i<10;i++)
      a[i]=i;
 return a; 
}
int main()
{
int k[10];
int* m=func();
 
 for(int i=0;i<10;i++)
    k[i]=m[i];
 for(int i=0;i<10;i++)  
    printf("%d ",k[i]);
 
 return 0;
 
}
выдаст 0 1 2 3 4 5 6 7 8 9
но если написать так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int* func()
{
 int a[10];
 for(int i=0;i<10;i++)
      a[i]=i;
 return a; 
}
int main()
{
int* m=func();
 
 for(int i=0;i<10;i++)
      printf("%d ",m[i]);
 
 return 0;
 
}
то выдавать будет 0 потом всякий мусор потому, что printf выделяя память под свои переменные портит значения
хотя сам указатель продолжает оставаться валидным ( иначе бы вылетела ошибка доступа к памяти)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.01.2013, 13:44     Что такое int*
Еще ссылки по теме:

C++ int[][] или int[] - что быстрее?
что такое int argc, char *argv[] в качестве параметров главной (main) функции? C++
Что значит такое объявление typedef int (*A) ( )? C++

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

Или воспользуйтесь поиском по форуму:
UserAK
70 / 70 / 4
Регистрация: 25.12.2012
Сообщений: 189
Записей в блоге: 2
24.01.2013, 13:44     Что такое int* #20
Цитата Сообщение от ValeryS Посмотреть сообщение
она не уничтожается, а объявляется свободной
это адрес объявляется свободным, то есть это уже не int* а void*, а переменной больше не существует. она осталась там внутри функции. а вот указатель на переменную в куче так и останется int*

Добавлено через 6 минут
я не знаю какие бывают операционные системы и как может повести себя программа под их управлением, может это виртуальная машина, запущенная на глючном компе, может приложение вместе со всем своим барахлом постоянно переезжает из одной области памяти в другую.
а может я не так понял вопрос. имхо вопрос был про правомерность считать возвращаемый указатель указателем на int.

Добавлено через 11 минут
переменная это же всё-таки абстрактное понятие, ну не знаю как грамотно выразить мысль - данные в контексте методов работы с ними, если есть данные в памяти но они выдернуты из контекста, это уже не переменная, а непонятно что. то есть в таком ракурсе вполне можно считать, что жизненный цикл переменной закончен - переменная уничтожена. нету её больше. это уже не она (как в фильмах ужасов) остался только безжизненный трупик где-то в стеке
Yandex
Объявления
24.01.2013, 13:44     Что такое int*
Ответ Создать тему
Опции темы

Текущее время: 20:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru