Указатели

Тема в разделе "Общие вопросы по С и С++", создана пользователем Herbert, 23 апр 2008.

  1. Herbert

    Herbert Гость

    Добрый день.
    Проблема моя состоит вот в чем:

    Хочу на С сделать программу, чтобы смотреть содержимое любого участка оперативной памяти.

    Почему-то не работает этот участок кода:

    Код (Text):


    for (i=1;i<=100; i++) {p=i; printf("%d ", *p);}


    То есть пытаюсь просто посмотреть что лежит в памяти, присваивая указателю значения от 1 до 100.
    Не работает…выкидывает по ходу выполнения.
    Причем если попробовать поэкспериментировать с границами i, то можно найти такие интервалы i где все работает нормально. Например при 6606848<=i<=6619132. То есть вот такой код работает нормально:


    Код (Text):
    #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, а просто так по памяти не лазить? В памяти есть участки, которые нельзя посмотреть?
     
  2. shisik

    shisik Well-Known Member

    Регистрация:
    26 авг 2007
    Сообщения:
    154
    Симпатии:
    0
    По-моему, таким образом можно просмотреть только адресное пространство своего же процесса и то только инициализированные его области (в которых что-то содержится).
     
  3. Yason

    Yason Гость

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

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

    Да, лучше обращаться только по адресам переменных, выделенных самостоятельно (в стеке или через malloc - не принципиально). Причина указана выше.
     
  4. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Не поленюсь (в который раз) посоветовать Рихтера - там внятно и подробно описано использование памяти. Например, первые 65К зарезервированы как раз для нахождения ошибочных указателей, и любое обращение по такому адресу приводит к AV.
     
  5. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Ну что тут можно добавить? Разве что дать ссылку на саму книгу: СКАЧАТЬ
     
  6. Herbert

    Herbert Гость

    Ok. Всем спасибо. Посмотрю, что в Рихтере пишут...
    Просто в книгах по С (из тех что я видел) этот вопрос стороной обходится.
     
  7. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Это вопрос не по языку программирования, а по организации памяти операционной системы. С точки зрения языка Ваши действия абсолютно корректны. Иначе бы код не скомпилировался
     
  8. shisik

    shisik Well-Known Member

    Регистрация:
    26 авг 2007
    Сообщения:
    154
    Симпатии:
    0
    Это и неудивительно. С - язык программирования, а данный вопрос относится скорей к ОС.
     
Загрузка...
Похожие Темы - Указатели
  1. filin94
    Ответов:
    1
    Просмотров:
    1.716

Поделиться этой страницей