| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Как достать доступ к виртуальной памяти |
| Автор: GIK 6.2.2007, 22:58 | ||||||
| Народ, привет Вобщем прочитал я пару статей про виндовую адресацию памяти, теперь интересует следующее: Компилятор не дает значение данных хранимых, к примеру, в виртуальной области от 0x00000000 до 0x0000FFFF Если я создаю указатель, то он ссылается на первый байт, но значение от этого указателя нельзя получить и присвоить соответсятвенно тоже. Как можно сделать так, чтобы доступ открылся?
Добавлено @ 23:12 Да, еще, чуть не забыл
Очень интересно наблюдать, когда выкидывает одинаковые числа
|
| Автор: Anikmar 6.2.2007, 23:17 | ||
По поводу первого участка:
А почему вы решили, что значение указателя g должно указывать на 1-й байт виртуальной памяти? Откуда такие утверждения? Вы просто видите значение переменной типа "указатель", которая НИЧЕМ не проинициализирована... |
| Автор: GIK 6.2.2007, 23:37 |
| Куда указывает указатель? Не на память с адресом в один байт? |
| Автор: Anikmar 6.2.2007, 23:42 |
| Он никуда не указывает! Это просто указатель. Чтобы он на что-то указывал ему нужно присвоить какое-нибудь значение. А так - все зависит от компилятора. В билдере, насколько я помню, указатель инициализируется значениме чуть больше нуля. Но не факт и в стандарте не прописано (насколько я знаю). |
| Автор: Romikgy 6.2.2007, 23:42 | ||
|
| Автор: Anikmar 6.2.2007, 23:43 |
| Romikgy, и? Не врубился... |
| Автор: Romikgy 6.2.2007, 23:47 |
я привел пример где указатель указывает на 4 бафта |
| Автор: Anikmar 6.2.2007, 23:53 | ||
И опять неправильно. С чего это следует? Пока он не инициализирован он никуда не указывает. Он МОЖЕТ указывать на память из 4-х байт (вернее на long). А если взять конструкцию:
pLong и pChar имеют одно и тоже значение? И на какой участок памяти они указывают? |
| Автор: Romikgy 7.2.2007, 00:03 |
| да неправильно высказался так правильно? |
| Автор: GIK 7.2.2007, 00:12 |
| Мне кажется в любом случае, если есть значение у указателя, значет оно, хотябы косвенно, куда то указывает.... Разве я не прав? Почему тогда нельзя взять данные из области с адресом 1? Или вообще нельзя брать данные, из неинициализированного указаьеля? |
| Автор: Romikgy 7.2.2007, 00:18 |
смотря что в нем срабатывает имхо защита на доступ в системную область |
| Автор: vinter 7.2.2007, 00:24 | ||
нельзя, и нормальный компилятор будет на это ругаться.. |
| Автор: Anikmar 7.2.2007, 00:35 |
Интерес чисто познавательный, а каким образом он будет ругаться? Я думал, что все что он скажет - это предупреждение "Возможное использование переменной до ее инициализации". (зачастую оно по умолчанию выключено) Или я чего-то не знаю? |
| Автор: SergeCpp 7.2.2007, 10:20 | ||
![]() http://www.ozon.ru/context/detail/id/87878/ В этой книге рассказано и есть пример. Советую найти (1998 год издания) и купить. |
| Автор: Sartorius 7.2.2007, 10:45 |
| SergeCpp, а на соклько это все вообще может быть актуально? Ясно, что ХР на NT ядре, но с 1998 года многое могло измениться. Тем более "недокументированные возможности" |
| Автор: GIK 7.2.2007, 10:46 |
| Все понятно, мне читать и читать. Как насчет второго момента? Почему инкремент адреса дает тоже число что и значенрие хранимое по адресу , до инкремента? |
| Автор: Sartorius 7.2.2007, 10:52 | ||
Рискну предположить, что там лежит это же число... |
| Автор: vinter 7.2.2007, 11:51 | ||
студия вылетает с ошибкой |
| Автор: Anikmar 7.2.2007, 13:40 | ||
Т.е. Студия при компиляции ругнется на такой код?
Вообще-то максимум предупреждение должно быть - на то оно и Си (в смысле сотворить можно что угодно) |
| Автор: GIK 7.2.2007, 15:59 | ||
Ага |
| Автор: vinter 7.2.2007, 18:36 | ||||
да, вылетит с ошибкой
на то он и компилятор, чтобы не давать творить ерунду всякую |
| Автор: Anikmar 7.2.2007, 18:45 | ||||
Это не всегда ошибка. Не должен вылететь компилятор - проверьте. Поясню на примере:
Сдесь никакой ошибки нет - вот захотелось так программеру... |
| Автор: vinter 7.2.2007, 19:02 | ||
а тут и не вылетает.. а вот там была ошибка.. кстати так и не понял почему у p и *pp, стали одинаковые адреса ведь мы же поменяли значение указателя *pp, и он стал указывать на другую область памяти, почему *p поменялся?? |
| Автор: GIK 7.2.2007, 19:16 |
| А вот меня болше интересует почему одинаковые данные вылазят, тут явно что то нето.... |
| Автор: Anikmar 7.2.2007, 20:19 | ||||
Мы немного отвлеклись от основного вопроса топика (совсем немного, на самом деле). При переносе указанного кода в мой Билдер были выданы разные числа.... Поэтому списываю на совпадение, хотя формат вывода целого числа и указателя явно должны отличаться. В Билдере выводятся разные числа, НО: они выводятся совершенно по-разному - формат у указателя и int разный... Добавлено @ 20:22
Вы просто невнимательно посмотрели. Я там поменял только значение указателю по адресу указателя. До сих пор не врубаюсь почему ругается компилятор? Ведь я привел достаточно простой пример неявного использования указателя, можно придумать более изощренный... Ну не должен компилятор на это ругаться! Он может предупредить, но ругаться нельзя - это не ошибка, это может так задумано было (конечно больным на голову программистом) - но могло. |
| Автор: threef 7.2.2007, 21:13 | ||
Че-йто совсем я не понимаю.
это что, попытка взглянуть на void ? |
| Автор: Anikmar 7.2.2007, 21:21 | ||
Вот на это точно должен ругаться компилятор. Указатель на void НЕ РАЗЫМЕНОВЫВАЕТСЯ! |
| Автор: threef 7.2.2007, 21:43 |
| Да что ты! А в первом посте что, g - это не указатель на void ? не его ли пытаются разыменовать ? а 0 - ffff - это указатели, зарезервированные системой виртуальной памяти как NULL - указатели, и ничего оттуда не выудить. Разве что в обход этой самой системы. И Це здесь ни причем. |
| Автор: Anikmar 7.2.2007, 21:48 | ||
Упс... А слона я и не заметил! Я начал читать не с первой строчки первого поста и что-то увлекся теорией! Ну, мои посты особо этому не противоречат Виноват-с-с-с... Обмишурился.... |
| Автор: W4FhLF 8.2.2007, 13:36 | ||
Это область выявления нулевых указателей. Она специально зарезервирована создателями ОС, физически этой области не существует, а при работе в режиме пользователя диспетчер памяти при обращении к страницам в пределах 0x00000000-0x0000FFFF выплюнет исключение, в режиме ядра, при отсутствии своего сеха, получишь БСОД. |
| Автор: GIK 8.2.2007, 17:57 | ||
| W4FhLF, спасибо конечно, но я это перечитал уже Как грица, чем дальше в лес тем шире партизаны Вот еще один не менее занимательный момент, у меня, кроме того что вылетает одинаковые числа (я закоментировал какие), еше разница в адресах имеет непонятную разницу. После инкремента указателя и декремента сразу, она равна 12, а после просто инкремента, она равна 4. Вобщем сдесь видно: Компилятор - булдер 6.0. Может он устарел?
|
| Автор: Anikmar 8.2.2007, 18:11 |
| Думаю все дело в выводе на экран. Если заменить cout на printf все нормально. Под отладчиком тоже все впорядке |
| Автор: W4FhLF 8.2.2007, 18:25 |
Тогда в чём вопрос изначально заключается? |
| Автор: GIK 8.2.2007, 18:34 |
| Ну я вообщето хотел доступ открыть Добавлено @ 18:38 Меня вообщето еще масса вопросов мучает, но чувствую, если модера заметят, что я их задаю, будут ругатся |
| Автор: Anikmar 8.2.2007, 18:53 |
| Странно, почему мое сообщение закрыли? Матного там нет - грубовато конечно, но в шутливом же аспекте... |
| Автор: W4FhLF 8.2.2007, 18:59 |
К несуществующему в физической памяти участку? Там нет ничего, ни виртуально, ни физически |
| Автор: SergeCpp 8.2.2007, 19:28 |
Вы ПМ читаете?.. Одно Вам отправлено при скрытии и одно я отправил. Прочтите их. |
| Автор: Anikmar 8.2.2007, 19:47 | ||
Точно! Тут же ящик есть - забыл совсем. Исправился - больше не буду. По крайней мере постараюсь. Какой хороший форум - даже себя обзывать нельзя! |
| Автор: SergeCpp 8.2.2007, 20:03 | ||
По теме памяти задавайте! ![]() http://sergecpp.mylivepage.ru/file/6/218/ ![]() |
| Автор: GIK 8.2.2007, 22:51 |
| О, какой приятный сюрпризик, однако |