Помощник
Здравствуйте, гость ( Вход | Регистрация )
|
|
23:04:2008, 17:40
|
|
Новенький ![]() Группа: Программист Сообщений: 19 Регистрация: 21:08:2007 Пользователь №: 12 411 Специализация: математическое моделирование Репутация: 0
|
Добрый день.
Проблема моя состоит вот в чем: Хочу на С сделать программу, чтобы смотреть содержимое любого участка оперативной памяти. Почему-то не работает этот участок кода: Код … … for (i=1;i<=100; i++) {p=i; printf("%d ", *p);} … … То есть пытаюсь просто посмотреть что лежит в памяти, присваивая указателю значения от 1 до 100. Не работает…выкидывает по ходу выполнения. Причем если попробовать поэкспериментировать с границами i, то можно найти такие интервалы i где все работает нормально. Например при 6606848<=i<=6619132. То есть вот такой код работает нормально: Код #include <stdio.h> #include <stdlib.h> main() { int a=0; int *p; int i; p=&a; printf("%d ", p); getchar(); for (i=6606848;i<=6619132; i++) { p=i; printf("%d ", *p); } getchar(); } Но если попытаться выйти за границы 6606848 6619132 в цикле, то ошибка. Ошибка возникает при выполнении (компилируется все нормально). Использую Builder 5.0 Код в стиле С89. Текст сообщения об ошибке такой: Project file.exe raised exception class EaccessViolation with message 'Access violation at address 0040119C. Read of address 00650000'. Process stopped. Use Step or Run to continue. Скажите, корректно ли вообще пытаться писать подобный код? Или лучше обращаться только к адресам в которые “сам что-то положил” или зарезервировал через malloc, а просто так по памяти не лазить? В памяти есть участки, которые нельзя посмотреть? |
|
Сообщение
#1
|
|
![]() |
|
|
23:04:2008, 17:44
|
|
============== ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 879 Регистрация: 11:01:2007 Пользователь №: 8 750 Специализация: specialist Репутация: 28
|
Книга дура, штык молодец ...
|
|
Сообщение
#2
|
|
|
|
23:04:2008, 18:04
|
|
Продвинутый ![]() ![]() Группа: Программист Сообщений: 137 Регистрация: 26:08:2007 Из: Харьков Пользователь №: 12 480 Специализация: С/C++ Репутация: 2
|
По-моему, таким образом можно просмотреть только адресное пространство своего же процесса и то только инициализированные его области (в которых что-то содержится).
|
|
Сообщение
#3
|
|
|
|
23:04:2008, 21:18
|
|
Продвинутый ![]() ![]() Группа: Программист Сообщений: 134 Регистрация: 27:02:2004 Пользователь №: 296 Репутация: 6
|
Скажите, корректно ли вообще пытаться писать подобный код? Не в обиду будь сказано, но если возникает такой вопрос - то Вам ещё рано писать такой код. Для этого нужно знать особенности работы системы памяти Windows, а для этого нужен довольно серьёзный уровень подготовки. Впрочем, если поиграть, то можно, но тогда не удивляйтесь AccessViolation'ам Цитата В памяти есть участки, которые нельзя посмотреть? Да, и довольно много. Некоторые можно только читать, некоторые - только писать, некоторые - выполнять, а некоторые - ничего нельзя (приложению). Цитата Или лучше обращаться только к адресам в которые “сам что-то положил” или зарезервировал через malloc, а просто так по памяти не лазить? Да, лучше обращаться только по адресам переменных, выделенных самостоятельно (в стеке или через malloc - не принципиально). Причина указана выше. |
|
Сообщение
#4
|
|
|
|
24:04:2008, 04:07
|
|
Мегагуру ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 706 Регистрация: 15:11:2005 Пользователь №: 2 573 Репутация: 6
|
Не поленюсь (в который раз) посоветовать Рихтера - там внятно и подробно описано использование памяти. Например, первые 65К зарезервированы как раз для нахождения ошибочных указателей, и любое обращение по такому адресу приводит к AV.
|
|
Сообщение
#5
|
|
|
|
24:04:2008, 06:42
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 869 Регистрация: 4:09:2006 Из: Минск Пользователь №: 6 316 Специализация: C++ Репутация: 31
|
Не поленюсь (в который раз) посоветовать Рихтера - там внятно и подробно описано использование памяти. Ну что тут можно добавить? Разве что дать ссылку на саму книгу: СКАЧАТЬ |
|
Сообщение
#6
|
|
|
|
24:04:2008, 14:10
|
|
Новенький ![]() Группа: Программист Сообщений: 19 Регистрация: 21:08:2007 Пользователь №: 12 411 Специализация: математическое моделирование Репутация: 0
|
Ok. Всем спасибо. Посмотрю, что в Рихтере пишут...
Просто в книгах по С (из тех что я видел) этот вопрос стороной обходится. |
|
Сообщение
#7
|
|
|
|
24:04:2008, 14:31
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 869 Регистрация: 4:09:2006 Из: Минск Пользователь №: 6 316 Специализация: C++ Репутация: 31
|
Это вопрос не по языку программирования, а по организации памяти операционной системы. С точки зрения языка Ваши действия абсолютно корректны. Иначе бы код не скомпилировался
|
|
Сообщение
#8
|
|
|
|
24:04:2008, 14:32
|
|
Продвинутый ![]() ![]() Группа: Программист Сообщений: 137 Регистрация: 26:08:2007 Из: Харьков Пользователь №: 12 480 Специализация: С/C++ Репутация: 2
|
|
|
Сообщение
#9
|
|
![]() |
|
Текстовая версия | Сейчас: 6:07:2008 - 17:59 |