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

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

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

Студворк — интернет-сервис помощи студентам
Заметил такую странную вещь:
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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
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 &lt;&lt; '\n'; } void Bar(int* &amp;val) ...

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

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

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

Может быть я вопрос неправильно задаю
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
31.07.2017, 12:16
Лучший ответ Сообщение было отмечено 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
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
31.07.2017, 12:25
Лучший ответ Сообщение было отмечено no swear как решение

Решение

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

Решение

Цитата Сообщение от TRam_ Посмотреть сообщение
Ибо очередное свободное место в куче относительно локального адресного пространства программы оказывается каждый раз в случайном месте. Тем более если при предыдущем запуске программа не очистила за собой динамически выделенную память (а значит ту память операционная система гарантированно не сможет использовать).
Нетъ!
1) У каждого процесса свое адресное пространство. И адрес, по которому в этом пространстве выделена память, имеет смысл лишь для самого процесса (ну и для системы). У разных процессов по одинаковым адресам лежат разные данные. Например у ТС адрес на стеке не меняется, хоть 100 программ одновременно запусти.
2) Вы правда считаете, что если вы забыли освободить память - она гарантированно потеряна для системы? Ну запустите несколько раз программу, состоящую только из выделения огромного количества памяти.
3) По теме: ASLR.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.08.2017, 02:41
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru