Форум программистов CODEBY.NET Хостинг в Беларуси — Active Technologies

Разработка бизнес сайтов

Нужны клиенты? Тогда сюда быстрее...
X   Сообщение сайта
(Сообщение закроется через 2 секунды)

Здравствуйте, гость ( Вход | Регистрация )




> Указатели, Присваивание указателю произвольных значений для просмотра памяти
Herbert
Вставить ник
сообщение 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
 
Новая тема 
Ответов (1 - 8)
sax_ol
Вставить ник
сообщение 23:04:2008, 17:44
Цитата Ответить 


==============
*****

Группа: Модеры
Сообщений: 1 879
Регистрация: 11:01:2007
Пользователь №: 8 750
Специализация: specialist



Репутация: - 28 +


Книга дура, штык молодец ...
Подняться вверх 
 
Сообщение #2
shisik
Вставить ник
сообщение 23:04:2008, 18:04
Цитата Ответить 


Продвинутый
**

Группа: Программист
Сообщений: 137
Регистрация: 26:08:2007
Из: Харьков
Пользователь №: 12 480
Специализация: С/C++



Репутация: - 2 +


По-моему, таким образом можно просмотреть только адресное пространство своего же процесса и то только инициализированные его области (в которых что-то содержится).
Подняться вверх 
 
Сообщение #3
Yason
Вставить ник
сообщение 23:04:2008, 21:18
Цитата Ответить 


Продвинутый
**

Группа: Программист
Сообщений: 134
Регистрация: 27:02:2004
Пользователь №: 296



Репутация: - 6 +


Цитата(Herbert @ 23:04:2008 - 21:40) *
Скажите, корректно ли вообще пытаться писать подобный код?

Не в обиду будь сказано, но если возникает такой вопрос - то Вам ещё рано писать такой код. Для этого нужно знать особенности работы системы памяти Windows, а для этого нужен довольно серьёзный уровень подготовки. Впрочем, если поиграть, то можно, но тогда не удивляйтесь AccessViolation'ам smile.gif

Цитата
В памяти есть участки, которые нельзя посмотреть?

Да, и довольно много. Некоторые можно только читать, некоторые - только писать, некоторые - выполнять, а некоторые - ничего нельзя (приложению).

Цитата
Или лучше обращаться только к адресам в которые “сам что-то положил” или зарезервировал через malloc, а просто так по памяти не лазить?

Да, лучше обращаться только по адресам переменных, выделенных самостоятельно (в стеке или через malloc - не принципиально). Причина указана выше.
Подняться вверх 
 
Сообщение #4
grigsoft
Вставить ник
сообщение 24:04:2008, 04:07
Цитата Ответить 


Мегагуру
****

Группа: Модеры
Сообщений: 706
Регистрация: 15:11:2005
Пользователь №: 2 573



Репутация: - 6 +


Не поленюсь (в который раз) посоветовать Рихтера - там внятно и подробно описано использование памяти. Например, первые 65К зарезервированы как раз для нахождения ошибочных указателей, и любое обращение по такому адресу приводит к AV.
Подняться вверх 
 
Сообщение #5
European
Вставить ник
сообщение 24:04:2008, 06:42
Цитата Ответить 


Божественный
*****

Группа: Модеры
Сообщений: 1 869
Регистрация: 4:09:2006
Из: Минск
Пользователь №: 6 316
Специализация: C++



Репутация: - 31 +


Цитата(grigsoft @ 24:04:2008 - 06:07) *
Не поленюсь (в который раз) посоветовать Рихтера - там внятно и подробно описано использование памяти.

Ну что тут можно добавить? Разве что дать ссылку на саму книгу: СКАЧАТЬ
Подняться вверх 
 
Сообщение #6
Herbert
Вставить ник
сообщение 24:04:2008, 14:10
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 19
Регистрация: 21:08:2007
Пользователь №: 12 411
Специализация: математическое моделирование



Репутация: - 0 +


Ok. Всем спасибо. Посмотрю, что в Рихтере пишут...
Просто в книгах по С (из тех что я видел) этот вопрос стороной обходится.
Подняться вверх 
 
Сообщение #7
European
Вставить ник
сообщение 24:04:2008, 14:31
Цитата Ответить 


Божественный
*****

Группа: Модеры
Сообщений: 1 869
Регистрация: 4:09:2006
Из: Минск
Пользователь №: 6 316
Специализация: C++



Репутация: - 31 +


Это вопрос не по языку программирования, а по организации памяти операционной системы. С точки зрения языка Ваши действия абсолютно корректны. Иначе бы код не скомпилировался
Подняться вверх 
 
Сообщение #8
shisik
Вставить ник
сообщение 24:04:2008, 14:32
Цитата Ответить 


Продвинутый
**

Группа: Программист
Сообщений: 137
Регистрация: 26:08:2007
Из: Харьков
Пользователь №: 12 480
Специализация: С/C++



Репутация: - 2 +


Цитата(Herbert @ 24:04:2008, 17:10 ) *
Ok. Всем спасибо. Посмотрю, что в Рихтере пишут...
Просто в книгах по С (из тех что я видел) этот вопрос стороной обходится.

Это и неудивительно. С - язык программирования, а данный вопрос относится скорей к ОС.
Подняться вверх 
 
Сообщение #9


Быстрый ответ  Ответить  Новая тема 

> Быстрый ответ
Полужирный
Курсив
Подчеркнутый
Вставить изображение
Смайлики
Цитата
Код
 
 Отправлять уведомления об ответах на e-mail |  Включить смайлики |  Добавить подпись
   

 

RSS Текстовая версия Сейчас: 6:07:2008 - 17:59
с нами можно связаться по:
телефону: +375-(29)-632-60-67
e-mail:info@codeby.net