Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
1

У указателя самопроизвольно меняется адрес

30.07.2017, 17:33. Показов 3321. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Заметил такую странную вещь:
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
using namespace std;
 
int main()
{
    int *p;
    p = new int(10);
    cout << p << ' ' << &p;
}
Если выводить без оператора & то адрес постоянно меняется а с & адрес указателя постоянен. С чем это может быть связанно?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.07.2017, 17:33
Ответы с готовыми решениями:

Адрес объекта, адрес указателя. Где что находится?
#include &lt;iostream&gt; void Foo(int* val) { std::cout &lt;&lt; val &lt;&lt; &quot; &quot; &lt;&lt; *val &lt;&lt; &quot; &quot; &lt;&lt; &amp;val...

Меняется значение указателя
Пытаюсь сделать односвязный список, но с этими указателями постоянно проблемы=( Помогите плз...

Получить адрес ИЗ указателя на адрес другой программы
В программе для редактирования RAM памяти процессов (в основном игровых =) ) ArtMoney можно...

Самопроизвольно меняется шрифт
В программе используется для edit, label, button шрифт Book Antiqua. На другом компьютере он...

19
Заблокирован
30.07.2017, 17:41 2
Цитата Сообщение от no swear Посмотреть сообщение
С чем это может быть связанно?
С тем, что память в куче выделяется по разным адресам (нарочно или нет — ХЗ), а положение стека не рандомизируется.
Хотя расположение стека тоже может рандомизироваться, см. https://wandbox.org/permlink/9JuGUYXaCRaD36GH
1
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
30.07.2017, 17:41 3
Цитата Сообщение от no swear Посмотреть сообщение
С чем это может быть связанно?
Сам указатель лежит в кадре стека функции, и &p - адрес самого указателя.
А в p содержится адрес в динамической памяти, который вернет new.
1
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
30.07.2017, 17:51  [ТС] 4
Цитата Сообщение от Croessmah Посмотреть сообщение
Сам указатель лежит в кадре стека функции
Какой ещё функции?
Цитата Сообщение от Croessmah Посмотреть сообщение
А в p содержится адрес в динамической памяти, который вернет new
Динамическая память = динамический адрес?
0
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
30.07.2017, 17:55 5
Цитата Сообщение от no swear Посмотреть сообщение
Какой ещё функции?
int main()
1
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
30.07.2017, 18:08  [ТС] 6
Значит это оператор new с каждым запуском программы меняет адрес памяти в котором будет храниться значение 10, а сам адрес указателя мы уже объявили (int *p) и он будет всегда постоянен, так?
0
Заблокирован
30.07.2017, 18:11 7
no swear, не так. Ты запускал несколько раз то, что я скинул по ссылке? Положение стека тоже может рандомизироваться.
0
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
30.07.2017, 18:13 8
у меня оба адреса меняются
0
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
30.07.2017, 18:14  [ТС] 9
Цитата Сообщение от dawn artist Посмотреть сообщение
Ты запускал несколько раз то, что я скинул по ссылке?
Да запускал, увидел что меняется. Но почему &p у меня всегда постоянен?
0
Заблокирован
30.07.2017, 18:16 10
no swear, потому что на твоей системе положение стека не рандомизируется.
0
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
30.07.2017, 18:18  [ТС] 11
А почему у oldnewyear рандомизируется и как сделать так чтобы у меня он тоже рандомизировался.
0
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
30.07.2017, 18:20 12
Цитата Сообщение от no swear Посмотреть сообщение
А почему у oldnewyear рандомизируется и как сделать так чтобы у меня он тоже рандомизировался.
для чего? Это не фича языка, это свойство ос. Оно может сейчас не рандомизироваться, а через 2 минуты рандомизироваться, вы же не знаете как ос память выделяет
1
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
30.07.2017, 18:24  [ТС] 13
А почему у меня адрес маленький(всего 8 символов) а в ссылке которую вы мне дали там 14 символов выводиться?
0
Заблокирован
30.07.2017, 19:53 14
no swear, потому что там адрес не маленький.
1
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
30.07.2017, 23:28 15
И в коде утечка памяти. После динамического создания объекта его надо удалять:
C++
1
delete p;
0
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
30.07.2017, 23:29 16
Цитата Сообщение от no swear Посмотреть сообщение
А почему у меня адрес маленький
no swear, размер не главное!
0
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
31.07.2017, 11:32  [ТС] 17
Ну вопрос какой был, что такое p и &p? В чём отличие между ними и почему первый меняется а второй нет? Ответа пока ещё не получил

Может быть я вопрос неправильно задаю
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
31.07.2017, 12:16 18
Лучший ответ Сообщение было отмечено no swear как решение

Решение

Цитата Сообщение от no swear Посмотреть сообщение
что такое p и &p?
Вообще вопрос должен быть - "что такое *p, p, &p".
*p - значение, которое было создано динамическим выделением памяти в строке p = new int(10); и которое составляет 10.
p - адрес этого значения. Поскольку динамически выделенные объекты (в том числе наше значение) создаются в куче ( https://ru.wikipedia.org/wiki/Куча_(память) ) то и адрес каждый раз операционная система выделяет по-разному. Ибо очередное свободное место в куче относительно локального адресного пространства программы оказывается каждый раз в случайном месте. Тем более если при предыдущем запуске программа не очистила за собой динамически выделенную память (а значит ту память операционная система гарантированно не сможет использовать).

&p - адрес переменной p, которая содержит адрес значения. То есть расположение int *p; в локальном адресном пространстве программы. Поскольку это локальная переменная, то она создаётся в стеке (т.е. https://ru.wikipedia.org/wiki/Стек) и, при одном и том же способе выполнения программы окажется в одном и том же месте локального адресного пространства.
1
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
31.07.2017, 12:25 19
Лучший ответ Сообщение было отмечено no swear как решение

Решение

Цитата Сообщение от no swear Посмотреть сообщение
Ну вопрос какой был, что такое p и &p? В чём отличие между ними и почему первый меняется а второй нет?
Указатель - это такая же переменная, просто её значение интерпретируется как адрес.
Как и у любой переменной, у неё есть адрес.
&p - адрес самого указателя.
Указатели
1
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
01.08.2017, 02:41 20
Лучший ответ Сообщение было отмечено no swear как решение

Решение

Цитата Сообщение от TRam_ Посмотреть сообщение
Ибо очередное свободное место в куче относительно локального адресного пространства программы оказывается каждый раз в случайном месте. Тем более если при предыдущем запуске программа не очистила за собой динамически выделенную память (а значит ту память операционная система гарантированно не сможет использовать).
Нетъ!
1) У каждого процесса свое адресное пространство. И адрес, по которому в этом пространстве выделена память, имеет смысл лишь для самого процесса (ну и для системы). У разных процессов по одинаковым адресам лежат разные данные. Например у ТС адрес на стеке не меняется, хоть 100 программ одновременно запусти.
2) Вы правда считаете, что если вы забыли освободить память - она гарантированно потеряна для системы? Ну запустите несколько раз программу, состоящую только из выделения огромного количества памяти.
3) По теме: ASLR.
2
01.08.2017, 02:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.08.2017, 02:41
Помогаю со студенческими работами здесь

Самопроизвольно меняется Volume ID
Доброго времени суток! На сервере постоянно меняется Volume id. ОС windows server 2012 r2, из...

Самопроизвольно меняется громкость звука
Доброго времени. Сразу прошу прощения за чайничьи формулировки. Непонятная ситуация: ни с того,...

Самопроизвольно меняется размер окон
В XP такого никогда небыло. А здесь постоянно окна расширяются настолько, что не помещаются в...

Исчезает звук, самопроизвольно меняется тема Windows
Доброго времени суток. Такая проблема. Не воспроизводятся mp3 в WMA, но Winamp проигрывает без...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru