Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242

Разные адреса одной и той же переменной. Почему?

02.02.2019, 01:21. Показов 2201. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот сам наткнулся на такую вещь.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int * GETAdress(int tmp)
{   return &tmp;    }
 
int main()
{
    int  a  =  6;
    int *pa;
 
    pa = GETAdress(a);
    cout << "Fun: " << GETAdress(a) << endl;
    cout << "pa:  " << pa << endl;
    cout << "&a:  " << &a << endl;
 
    _getch();
    return 0;
}
Вывод:
Fun: 00F9F9F0
pa: 00F9F9F4
&a: 00F9FAD4

Почему когда я присваиваю pa возвращаемое значение(адрес) функции, то адрес один присваивается. А когда вызываю отдельно функцию(передаю всё те же пар-ры), то адрес отличается. Потом вывожу адрес самой переменной a - адрес опять отличается!
Думал, может из-за того, что при каждом новом вызове функции, создается новая переменная и соответственно, новый адрес. Но, нет. Подряд вызывал саму функцию - всё одно и то же.

Даже пытался изменять значения, по отличаемым адресам, значения менялись везде. Такое ощущение, что создается указатель на указатель и так много раз. Как это вообще работает???

PS: скорее всего это из-за функции, так как где то читал, что туда копируется то что мы передаем, а значит и где то хранится, а значит и адрес новый...Но всё как то запутано для меня...

Буду благодарен за развернутый ответ!)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.02.2019, 01:21
Ответы с готовыми решениями:

Два адреса одной и той же страницы
Просматривая ошибки в Google админ увидел повторяющиеся одинаковый тайтл &lt;div&gt;CODE&lt;/div&gt;&lt;div&gt;Повторяющийся тайтл ? ...

Адреса одной и той же страницы с index.php
Здравствуйте. Расскажите пожалуйста, считаются ли вашсайт.ru и вашсайт.ru/index.php разными страницами с идентичным контентом? Спасибо.

Разные фоны блоков на одной и той же странице
Добрый день, прописываю на странице код: &lt;div style=&quot;background-color: #c9c;&quot;&gt;текст&lt;/div&gt;, но у меня задник растягивается только под...

5
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
02.02.2019, 01:57
GETAdress возвращает адрес своего аргумента, который копируется.

Вам стоит передавать аргумент по ссылке.
C++
1
2
int * GETAdress(int& tmp)
{   return &tmp;    }
Добавлено через 2 минуты
Fun: 0x7ffdcb302c74
pa: 0x7ffdcb302c74
&a: 0x7ffdcb302c74
Вот результаты теста.

Суть в том, что Вы передали параметр по значению и он скопировался. То есть, у Вас tmp — уже другая переменная, а не a.
1
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
02.02.2019, 02:17  [ТС]
New man, за ссылки я знаю, то понятно. "То есть, у Вас tmp — уже другая переменная, а не a." - хмм, об этом я не задумывался, спасибо. Но тогда почему меняя по любому из трех адресов что-то(например *pa = 23), меняется всё везде?
0
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
02.02.2019, 02:35
Лучший ответ Сообщение было отмечено MJ_PRUTYG как решение

Решение

Смотрите по порядку. Это очень упрощённое объяснение, в реальности всё может быть иначе из-за оптимизаций компилятора.
Вообще, стандарт не гарантирует, в каком порядке компилятор уложит локальные переменные.

Вы выделили память на стеке под переменную a.
&a == 00F9FAD4
Следовательно, указатель на свободный адрес на стеке сместился на размер int.

Потом Вы выделили на стеке место под переменную pa, указатель стека сместился ещё.
И вот уже в этот адрес скопировался аргумент функции и его вернула функция.

Потом Вы положили на стек результат вызова cout << "Fun: ", а именно, ссылку на объект std::cout. Потом повторилась ситуация с предыдущим вызовом функции, но состояние стека было уже другим, поэтому и параметр скопировался в другое место.

В случае же передачи параметра по ссылке, адрес a вычисляется ещё до вызова, так как в машинном коде ссылки обрабатываются как указатели.

Добавлено через 4 минуты
Влияние оптимизаций на вычисление:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
int * GETAdress(int tmp)
{   return &tmp;    }
 
int main()
{
    using namespace std;
    int  a  =  6;
    cout << GETAdress(a) << endl;
    cout << GETAdress(a) << endl;
    return 0;
}
При компиляции компилятором clang без оптимизаций (-O0) вывело:
0x7ffde5fe52dc
0x7ffde5fe52dc
С оптимизацией (-O2):
0x7ffebfbb9400
0x7ffebfbb9404
1
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
02.02.2019, 02:48  [ТС]
New man, ааа, я понял, это довольно многое объясняет. Спасибо большое! Только один момент. Почему у меня заполняется стек в обратную сторону? Имею ввиду что...Например у вас идет 0x7ffebfbb9400, а потом 0х...404. А у меня сначала второе, потом первое. Как будто с конца? Так же быть не должно, неправда ли? Или я что-то упускаю?(тот же код)
0
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
02.02.2019, 03:05
Конкретный порядок роста стека определяется платформой.
C++ при компиляции вообще по особому отрабатывает это дело.

Смотри код:
C++
1
2
3
int arr[10];
int* begin = &arr[0];
int* end = &arr[10];
Так вот, в численном виде указатель end может оказаться как меньше, так и больше begin. Но C++ гарантирует, что оператор сравнения указателей на уровне C++ всегда будет возращать true для выражения begin<end.

Добавлено через 2 минуты
То есть, он просто меняет операцию на противоположную при компиляции на платформу, где Int(begin)>Int(end).
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.02.2019, 03:05
Помогаю со студенческими работами здесь

Разные ошибки в одной и той же программе с разными IDE
Добрый день. Столкнулся с проблемой. Начинал писать в Ubuntu используя QtCreator. Компилятор GCC. Все работало. Потом исходники перенес...

Разные драйверы под разное железо на одной и той же системе Windows
Можно ли установить в системе драйвера под разные типы железа и по необходимости выбирать&quot; нужный pack драйверов? Не будут ли они...

Как вывести наибольшее число из одной и той же переменной?
Дано натуральное число N. Получить наибольшее число вида 4k , меньшее N. Результат вывести на экран и записать в файл. class Program ...

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

Почему разные адреса одного и того же элемента динамического массива?
Я создаю динамический массив и отправляю его в функцию, если потом сравнивать адреса элементов массива в главной и вызываемой функции они...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru