присвоение значения адресу - PullRequest
       0

присвоение значения адресу

1 голос
/ 03 сентября 2011

Я попробовал приведенную ниже программу, чтобы указатель указывал на конкретный адрес и сохранял значение в этом адресе. Когда я делаю указатель, содержащий значение для назначенного адреса, я получаю сообщение об ошибке времени выполнения, спрашивая меня закрыть программу. Нельзя ли присвоить значение адресу 0x6778.Почему это так? В каких ситуациях это нужно? Пожалуйста, помогите мне понять.

int *p=(int*)0x6778;    
printf("The address is:%x",p);

При попытке сделать * p = 1000 я получаю сообщение об ошибке.

Ответы [ 3 ]

5 голосов
/ 03 сентября 2011

Существует множество причин, по которым это может привести к ошибке:

  1. Адрес 0x6778 может не являться частью виртуальной памяти этого процесса - он может не существовать. Вы можете прочитать больше о виртуальной памяти, но в основном адреса не ссылаются непосредственно на физические байты - они должны быть переведены в таблицу, и в этой таблице может не быть записи для вашего адреса.

  2. Если он сопоставлен, он может находиться на странице только для чтения

  3. Если он сопоставлен и доступен для записи, он может повредить какую-то другую часть вашей программы, вскоре после этого возникла ошибка.

Как правило, вы не можете писать по произвольному адресу в приложении уровня пользователя. Конечно, если вы используете ядро ​​или встроенную систему, игнорируйте этот ответ, так как он совершенно не применим; -)

3 голосов
/ 03 сентября 2011

Этот адрес, вероятно, отсутствует в адресном пространстве вашего процесса, поэтому ваша программа получает исключение из операционной системы, когда вы пытаетесь получить к нему доступ. Вы не должны пытаться использовать определенные области памяти для хранения вещей ... скорее, используйте malloc для динамического выделения или помещайте вещи в стек.

1 голос
/ 03 сентября 2011
int *p=(int*)0x6778;    

Для этого адресное местоположение 0x6778 должно быть на первом месте действительным адресом.

Адресное пространство выделяется для каждого процесса, Ваша программа запускается в определенном процессе, еслипрограмма пытается получить доступ к адресу за пределами своего адресного пространства, после чего происходит сбой.Кажется, что происходит в вашем случае.

Если вы не уверены, что местоположение виртуального адреса является допустимым для использования вашей программой НЕ доступ к адресам явно , пусть компилятор помещает типы вадресное пространство выделено вашему процессу и верните его вам.Для этого проще всего использовать локальные переменные с автоматическим хранением или использовать malloc для динамического распределения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...