С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
#1

Как инициализировать указатель произвольным адресом? - C++

10.04.2013, 08:30. Просмотров 1958. Ответов 30
Метки нет (Все метки)

Как инициализировать указатель произвольным адресом?
C++
int *ptr;
 
ptr = ? ; // КАК ЭТО СДЕЛАТЬ?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2013, 08:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как инициализировать указатель произвольным адресом? (C++):

как инициализировать указатель на структуру - C++
Помогите розобратся, если можно с краткими примерами... __ как инициализировать указатель на структуру? __как инициализировать поле...

Как объявить указатель на массив через typedef и как инициализировать такой тип - C++
Как заставить заработать этот фрагмент кода? INT_L -- указатель на массив из 100 элементов типа char; Не получается в переменную C...

Передать указатель в функцию и там его инициализировать - C++
Друзья, как передать указатель в функцию там ему выделить память, чтобы на выходи из функции у меня был рабочий указатель ???

Как получить ссылку на указатель или указатель на указатель в массиве? - C++
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...

Как правильно удалять выделенную память под указатель на указатель? - C++
есть код #include <iostream> #include <conio.h> #include <stdlib.h> #include <time.h> using namespace std; void sort_1(const...

Почему указатель на указатель объявляется как float **A; - C++
Почему float?

30
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
10.04.2013, 11:21 #16
А мало ли какому кроскомпилу она это скормит? Да и часть системной памяти располагается по статическим адресам, например, статически размещена функция GetProcAdress. Условия допустимости такой адресации названы.
1
Pure
228 / 49 / 2
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
10.04.2013, 11:50 #17
Цитата Сообщение от taras atavin Посмотреть сообщение
располагается по статическим адресам
статические адреса? бишь опять таки виртуальные адреса просто всегда занятые в каждом процессе, бишь адреса с доступом только на чтение -выполнение. Об этом было сказано, ты делаешь вид или правда не понимаешь? Может по твоему данная функция оси расположена по физическому адресу ОЗУ? т.е. на твой взгляд адрес сей функции == адрес в ОЗУ. Ты препод или проггер?

Виндовс, как и, предполагаю, линукс не дают доступа к железу. Все виртуальщина уж давно
1
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
10.04.2013, 12:56 #18
Цитата Сообщение от Pure Посмотреть сообщение
Может по твоему данная функция оси расположена по физическому адресу ОЗУ?
В dosе разве что, или ещё на какой однозадачной системе, но ведь и оператор разыменования принимает тоже виртуальный адрес и в данном случае он постоянный.

Добавлено через 1 минуту
Цитата Сообщение от Pure Посмотреть сообщение
Виндовс, как и, предполагаю, линукс не дают доступа к железу. Все виртуальщина уж давно
Любой виртуальный адрес соответствует какому то физическому адресу, в данном случае соответствие однозначно для конкретного экземпляра оси, инфа же располагается в ОЗУ, ПЗУ, или ещё какой физической памяти. Другой вопрос, что конкретно 0xF0 может и не существовать.

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

Добавлено через 6 минут
Даже на винде так. А ведь есть ещё контроллеры и сигнальные камушки без страничной памяти, там адреса сразу физические. Так что пока целевая система не названа, нельзя утверждать, что адрес виртуальный, или не принадлежит ОЗУ.

Добавлено через 2 минуты
В общем случае может быть всё, что угодно.
1
Pure
228 / 49 / 2
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
11.04.2013, 10:22 #19
taras atavin, [вырезано цензурой]
все эти адреса - виртуальны и только на этом уровне гарантирована их статичность для тех функций ос о которых ты пишешь. Куда они отобразятся на физику - никаких гарантий нет, а это == мы не знаем физический адрес этой функции GetProceeAddress и не узнаем его, более того это и не нужно, по факту знаем лишь ее виртуальный адрес.
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
11.04.2013, 10:43 #20
Цитата Сообщение от Pure Посмотреть сообщение
все эти адреса - виртуальны и только на этом уровне гарантирована их статичность для тех функций ос о которых ты пишешь. Куда они отобразятся на физику - никаких гарантий нет,
Куда нибудь отобразятся точно, ТС не сказала, что у неё адрес физический, а виртуальный адрес - это тоже адрес и код физически существует в единственном экземпляре. Кроме того, не названа целевая машина, система и всё остальное. Может именно там адрес сразу физический? Вот смотри: приехал ты в чужой город и говоришь местному: я хочу узнать, что написано на стене дома с пальмой в окне и в пятнадцати метрах к северу от памятника Пушкину мелом на 5 см ниже подоконника первого этажа. Это и есть вирутальный адрес, чему то он соотвествует. Если памятники в городе переедут на новые постаменты, или кто то выставит пальму в другое окно, то соответствие изменится. Но в текущем состоянии прочитать надпись можно и она действительно на стене. Теперь местный сверяется по карте, вспоминает, где могут быть пальмы и говорит: иди на Кирова 57, её пересекает проспект Мира, угол противоположный от пересечения ,находится на нужном расстоянии от памятника и в окне торчит пальма. Это физический адрес. Садишься в такси, едешь по такому адресу и читаешь надпись. В чём проблема? Только в случае винды карту расположения памятников достаёт сам таксист, а табличка с номером дома и названием улицы приезжему остаётся не видна.

Добавлено через 5 минут
Другое дело, что единственный памятник может оказаться в центре площади радиусом метров так 50, тогда указанный виртуальный адрес вообще не существует.
0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,389
Записей в блоге: 2
Завершенные тесты: 1
11.04.2013, 11:04 #21
Цитата Сообщение от Pure Посмотреть сообщение
Виндовс, как и, предполагаю, линукс не дают доступа к железу.
Дело не в ОС, дело в том, что эти ОС работают в protected mode с включеным paging'ом, а он (protected mode) уже не даст лезть куда не просят. Т.е. защита на уровне процессора, а не на уровне ОС,

Цитата Сообщение от taras atavin Посмотреть сообщение
В dosе разве что, или ещё на какой однозадачной системе
Опять же дело не в ДОСе, а в том, что ДОС работает в real mode с сегментной организацией памяти, т.е. прибавив базу сегмента к смещению мы реально имеем физический адрес в ОЗУ.

Добавлено через 58 секунд
Цитата Сообщение от Kastaneda Посмотреть сообщение
protected mode с включеным paging'ом, а он (protected mode) уже не даст лезть куда не просят
то же относится к lond mode.

Добавлено через 54 секунды
И да, получить физический адрес таки можно, только вот потом ты с ним все равно ничего сделать не сможешь.
0
Pure
228 / 49 / 2
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
11.04.2013, 18:48 #22
Цитата Сообщение от Kastaneda Посмотреть сообщение
Дело не в ОС
ну так в ОС же дело. оне ж так сделаны что работают так как работают.
Цитата Сообщение от Kastaneda Посмотреть сообщение
И да, получить физический адрес таки можно
просим официальный способ
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
11.04.2013, 18:55 #23
Цитата Сообщение от Kastaneda Посмотреть сообщение
Т.е. защита на уровне процессора, а не на уровне ОС,
Процессор знать не знает, кого и куда не надо пускать. Сама ось, кстати, вообще не сможет работать без доступа везде. Так что защищает именно ось, но ось исполняется камнем.

Добавлено через 1 минуту
Цитата Сообщение от Kastaneda Посмотреть сообщение
Опять же дело не в ДОСе, а в том, что ДОС работает в real mode с сегментной организацией памяти, т.е. прибавив базу сегмента к смещению мы реально имеем физический адрес в ОЗУ.
Ну винда же работает в другом режиме, так что дело именно в досе. Точнее в том, для какого режима он писан. И где я назвал конкретный дос? TR-DOS тоже DOS, но там ничего складывать не нужно.

Добавлено через 3 минуты
Цитата Сообщение от Pure Посмотреть сообщение
просим официальный способ
Сама ось может, ей как бы разрешено.
0
Pure
228 / 49 / 2
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
11.04.2013, 19:23 #24
Цитата Сообщение от taras atavin Посмотреть сообщение
Сама ось может, ей как бы разрешено.
так речь о юзере который работает на ОС. Я утверждаю что под управлением не реалтайм ос нет досупа к физике а вот товарисч пишет что есть. Будет интересно
0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,389
Записей в блоге: 2
Завершенные тесты: 1
11.04.2013, 21:25 #25
Цитата Сообщение от taras atavin Посмотреть сообщение
Процессор знать не знает, кого и куда не надо пускать. Так что защищает именно ось, но ось исполняется камнем.
Суть в следующем - защита происходит по CPL и по флагам в записи каталогах/таблицах страниц. Когда ОС только загружается, она загружается в real mode, в этом режиме формируются каталоги/таблицы страниц, где и выставляются нужные флаги. Потом код загрузчика переводит процессор в protected mode (если мы говорим о 32х битных ОС) и дальше уже загружается непостредственно ОС. Так вот, когда пользователь выполняет свою программу, она выполняется с CPL = 3, и когда эта программа попробует обратиться туда, куда не просят, то защита сработает на уровне процессора (будет GP exception), задача ОС всего лишь корректно обработать это исключение. Сама ОС защитой такого уровня не занимается.


Цитата Сообщение от taras atavin Посмотреть сообщение
Сама ось, кстати, вообще не сможет работать без доступа везде.
Да, тот же "Hello, World" требует нулевого CPL для записи в видеопамять. Поэтому код вывода строки в консоль работает на нулевом уровне привилегий, в котором есть возможность дотянутся туда, куда другим запрещено. Переход на нулевой уровень происходит, например, через шлюз прерывания (печать строки есть прерывание), при возврате из обработчика прерывания CPL восстанавливается.

Цитата Сообщение от taras atavin Посмотреть сообщение
TR-DOS тоже DOS, но там ничего складывать не нужно.
Незнаю, что такое TR-DOS, но в real mode нужно сложить базу из сегментного регистра умноженную на 16 со смещением, чтоб получить физический адрес. В других режимах все еще сложнее.


Цитата Сообщение от Pure Посмотреть сообщение
Я утверждаю что под управлением не реалтайм ос нет досупа к физике а вот товарисч пишет что есть.
Ты мои слова не правильно понял, я писал

Цитата Сообщение от Kastaneda Посмотреть сообщение
И да, получить физический адрес таки можно, только вот потом ты с ним все равно ничего сделать не сможешь.
Т.е. имея на руках виртуальный адрес можно вычислить какому физическому адресу он соответствует.
Я хорошо понимаю, как это сделать переключившись в real mode Но вот из protected mode нужно будет читать значения, имея на руках например физический адрес каталога страниц, который процессором воспримется как вритуальный, и в итоге прочитается не то, что нужно. Поэтому стандартными средствами С этого не сделать. Я где-то натыкался на сишный код под Linux, где происходит вычисление физического адреса при помощи gcc builtin функций. Если интересно, можно погуглить.
0
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
12.04.2013, 12:52  [ТС] #26
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
ptr=(int*)0x903280;
Я проверила, пишет "ошибка доступа"
0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,389
Записей в блоге: 2
Завершенные тесты: 1
12.04.2013, 12:56 #27
Цитата Сообщение от programina Посмотреть сообщение
Я проверила, пишет "ошибка доступа"
Дык это что за адрес? Просто от балды? Он может быть просто не мапирован.
0
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
12.04.2013, 13:05  [ТС] #28
Цитата Сообщение от Kastaneda Посмотреть сообщение
Дык это что за адрес? Просто от балды? Он может быть просто не мапирован.
О, точно! Нужно создать переменную, узнать ее адрес, этим адресом инициализировать указатель, и затем разыменовать его чтобы узнать будет ли в нем значение той переменной, у которой узнавали адрес.
Только как это провернуть?
0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,389
Записей в блоге: 2
Завершенные тесты: 1
12.04.2013, 13:10 #29
Цитата Сообщение от programina Посмотреть сообщение
О, точно! Нужно создать переменную, узнать ее адрес, этим адресом инициализировать указатель, и затем разыменовать его чтобы узнать будет ли в нем значение той переменной, у которой узнавали адрес.
Только как это провернуть?
Запускаешь программу, выводишь адрес переменной, закрываешь. Вставляешь в свой код этот адрес, запускаешь и вуаля - ОС загрузила программу в другой участок памяти и адрес опять не валидный
Короче в общем случае никак, но можно надеятся на везение, конкретно на то, что адрес переменной останется валидным при перезапуске программы.

Но можно сделать по другому
C++
1
2
3
4
5
int value = 5;
long ptr = 0;
std::cout << (long) &value; // выводим адрес переменной
std::cin >> ptr; // считываем его в переменную
std::cout << *((int*)ptr); // выводим значение по этому адресу.
1
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
12.04.2013, 13:36  [ТС] #30
Цитата Сообщение от Kastaneda Посмотреть сообщение
Короче в общем случае никак, но можно надеятся на везение, конкретно на то, что адрес переменной останется валидным при перезапуске программы
А если наделать очень много однобайтовых переменных в весь обьем доступной памяти, то шансы угадать увеличатся?
0
12.04.2013, 13:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2013, 13:36
Привет! Вот еще темы с ответами:

Расскажите, как здесь работает указатель на указатель? - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;locale.h&gt; using namespace std; void main() { setlocale(LC_ALL, &quot;rus&quot;); ...

Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив) - C++
Изучаю c++ по одной книжке.Она говорить не умеет.. Так вот понадобилось написать функцию,которая как параметр получает указатель на...

Как передать параметр типа "указатель на указатель" в функцию? - C++
#include &quot;stdafx.h&quot; #include &lt;conio.h&gt; #include &lt;iostream&gt; using namespace std; #include &lt;iomanip&gt; using std::setiosflags; ...

Подскажите, как преобразовать строку с IP адресом в число и обратно - C++
Есть IP адрес в std::string &quot;192.168.1.1&quot;, нужно преобразовать его в число, а IP адрес числом преобразовать обратно, не используя сторонних...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.