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

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

30.07.2017, 17:33. Показов 3957. Ответов 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
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 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
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru