Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.77/26: Рейтинг темы: голосов - 26, средняя оценка - 4.77
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2

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

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

Студворк — интернет-сервис помощи студентам
Как инициализировать указатель произвольным адресом?
C++
int *ptr;
 
ptr = ? ; // КАК ЭТО СДЕЛАТЬ?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.04.2013, 08:30
Ответы с готовыми решениями:

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

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

Как считать матрицу из файла с произвольным типом элементов и произвольным размером матрицы
У меня есть шаблонный класс Matrix, шаблоном является тип элементов. Как можно считать матрицу элементов шаблонного типа из файла, если мы...

30
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
11.04.2013, 11:04
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Pure Посмотреть сообщение
Виндовс, как и, предполагаю, линукс не дают доступа к железу.
Дело не в ОС, дело в том, что эти ОС работают в protected mode с включеным paging'ом, а он (protected mode) уже не даст лезть куда не просят. Т.е. защита на уровне процессора, а не на уровне ОС,

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

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

Добавлено через 54 секунды
И да, получить физический адрес таки можно, только вот потом ты с ним все равно ничего сделать не сможешь.
0
 Аватар для Pure
228 / 52 / 7
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 26
11.04.2013, 18:48
Цитата Сообщение от Kastaneda Посмотреть сообщение
Дело не в ОС
ну так в ОС же дело. оне ж так сделаны что работают так как работают.
Цитата Сообщение от Kastaneda Посмотреть сообщение
И да, получить физический адрес таки можно
просим официальный способ
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
11.04.2013, 18:55
Цитата Сообщение от Kastaneda Посмотреть сообщение
Т.е. защита на уровне процессора, а не на уровне ОС,
Процессор знать не знает, кого и куда не надо пускать. Сама ось, кстати, вообще не сможет работать без доступа везде. Так что защищает именно ось, но ось исполняется камнем.

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

Добавлено через 3 минуты
Цитата Сообщение от Pure Посмотреть сообщение
просим официальный способ
Сама ось может, ей как бы разрешено.
0
 Аватар для Pure
228 / 52 / 7
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 26
11.04.2013, 19:23
Цитата Сообщение от taras atavin Посмотреть сообщение
Сама ось может, ей как бы разрешено.
так речь о юзере который работает на ОС. Я утверждаю что под управлением не реалтайм ос нет досупа к физике а вот товарисч пишет что есть. Будет интересно
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
11.04.2013, 21: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
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
12.04.2013, 12:52  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
ptr=(int*)0x903280;
Я проверила, пишет "ошибка доступа"
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
12.04.2013, 12:56
Цитата Сообщение от programina Посмотреть сообщение
Я проверила, пишет "ошибка доступа"
Дык это что за адрес? Просто от балды? Он может быть просто не мапирован.
0
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
12.04.2013, 13:05  [ТС]
Цитата Сообщение от Kastaneda Посмотреть сообщение
Дык это что за адрес? Просто от балды? Он может быть просто не мапирован.
О, точно! Нужно создать переменную, узнать ее адрес, этим адресом инициализировать указатель, и затем разыменовать его чтобы узнать будет ли в нем значение той переменной, у которой узнавали адрес.
Только как это провернуть?
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
12.04.2013, 13:10
Цитата Сообщение от 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
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
12.04.2013, 13:36  [ТС]
Цитата Сообщение от Kastaneda Посмотреть сообщение
Короче в общем случае никак, но можно надеятся на везение, конкретно на то, что адрес переменной останется валидным при перезапуске программы
А если наделать очень много однобайтовых переменных в весь обьем доступной памяти, то шансы угадать увеличатся?
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
17.05.2014, 15:25
Цитата Сообщение от Kastaneda Посмотреть сообщение
Суть в следующем - защита происходит по CPL и по флагам в записи каталогах/таблицах страниц.
А кто каталоги формирует?

Добавлено через 1 минуту
Цитата Сообщение от Kastaneda Посмотреть сообщение
Когда ОС только загружается, она загружается в real mode, в этом режиме формируются каталоги/таблицы страниц, где и выставляются нужные флаги. Потом код загрузчика переводит процессор в protected mode (если мы говорим о 32х битных ОС) и дальше уже загружается непостредственно ОС.
А ничего, что без возможности манипулировать таблицами каталога страниц многозадачная ось не сможет дефрагментировать свободную память и быстро свалится?

Добавлено через 2 минуты
Цитата Сообщение от Kastaneda Посмотреть сообщение
и когда эта программа попробует обратиться туда, куда не просят, то защита сработает на уровне процессора (будет GP exception), задача ОС всего лишь корректно обработать это исключение. Сама ОС защитой такого уровня не занимается.
Нет. Задача оси распределить память. Кстати, а как вообще загружать пользовательский процесс, если вся память распределена ещё системным загрузчиком?

Добавлено через 5 минут
Цитата Сообщение от Kastaneda Посмотреть сообщение
Незнаю, что такое TR-DOS, но в real mode нужно сложить базу из сегментного регистра умноженную на 16 со смещением, чтоб получить физический адрес. В других режимах все еще сложнее.
Операционная система дисковой версии спектрума, чей камень вообще не знаком с режимами, а все адреса там физические. На спектруме вопрос о том, сегментная ли у него память, или плоская, - это лишь вопрос интерпретации адресного регистра в качестве регистровой пары восьмибитных регистров, или одиночного шестнаднцатибитного регистра, поддерживаются оба варианта инкремента/декремента адресов. Смещение восьмибитная, адрес шестнадцатибитный, множитель базы 256.

Добавлено через 6 минут
Цитата Сообщение от programina Посмотреть сообщение
А если наделать очень много однобайтовых переменных в весь обьем доступной памяти, то шансы угадать увеличатся?
Зачем вообще угадывать? Или читай маны по статическим адресам, или
C++
1
2
3
4
int x;
int *p;
p=&x;// Здесь программа сама помещает адрес переменной в указатель
std::cout<<*p; //А здесь по этому адресу читаем данные и выводим их в поток
, или
C++
1
2
3
4
int *p;
p=new int;// Здесь уже система помещает адрес переменной в указатель, при этом создавая переменную, имени такая переменная не имеет
std::cout<<*p; //А здесь по этому адресу читаем данные и выводим их в поток
delete p; // После использования надо переменную удалить, а указатель на неё освободить
.

Добавлено через 9 минут

Не по теме:

Прочитал надпись на заборе. Отсылку не понял.
Облака на небе сложились во фразу: «А чего сложного? <a href="иди в гугл">fdfds</a>.».



Добавлено через 2 часа 17 минут
И не забывайте о том, что ТС не сказала, что пишет. Если как раз ось, то физический адрес вполне доступен. А если ещё и реального режима, то ещё смешней.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.05.2014, 15:25

Можно ли инициализировать указатель внутри условия?
Visual Studio выдает ошибку о том, что в строке found = search(n, m, matrix, route, priorityDirs); указатель priorityDirs не...

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

Указатель а (типа int) был с адресом "1С96", вопрос — Какой адрес станет у а, после а+=2?
вопрос значит вот какой: Указатель а (типа int) был с адресом &quot;1С96&quot; , вопрос - Какой адрес станет у а, после а+=2?

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

Возможно ли указатель производного класса инициализировать объектом базового класса?
имеется связка наследуемых классов A-&gt;B а от B наследуются одновременно еще два класса B-&gt;C и B-&gt;D class A { public: ...


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru