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

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

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

Author24 — интернет-сервис помощи студентам
Как инициализировать указатель произвольным адресом?
C++
int *ptr;
 
ptr = ? ; // КАК ЭТО СДЕЛАТЬ?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.04.2013, 08:30
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru