Измените *(0x7fffdf222fec)
на *(int*)0x7fffdf222fec
.
0x7fffdf222fec
- константа с типом long int
.Вы не можете разыменовывать типы без указателей, поэтому сначала вам нужно привести их к указателю.Какой указатель вы выберете, зависит от того, как вы хотите интерпретировать данные по этому адресу.Я выбрал int*
для этого примера, но вы можете выбрать любой тип указателя, кроме void*
.
Обратите внимание, что есть вероятность, что это приведет к segfault.Не делайте этого, если вы не уверены, что имеете доступ к этому местоположению.
Чтобы уточнить:
Не могу ли я получить доступ к значениям в этом месте, используя этот способ?
Ну, это зависит от того, что вы имеете в виду.Это правильный способ прочитать это конкретное место.Проблема в том, что у вас может не быть к нему доступа.
Контроль доступа в целом вне вашей досягаемости.Ошибка сегментации - это в основном способ, которым операционные системы говорят вам, что вы сделали что-то непослушное.
Подробнее о сбоях сегментации вы можете прочитать здесь
Получение доступа к произвольной части памяти довольно сложно и в значительной степени зависит от системы.На Unix-машинах это делается не так, как на Windows-компьютерах.
Также помните, что в большинстве современных операционных систем используется виртуальная память, поэтому адрес, который вы пытаетесь прочитать, не является физическим адресом.,ОС сопоставляет виртуальный адрес с физическим адресом.Подробнее здесь
Я написал такую программу и получил адрес a как
Вы не гарантированно получите тот же адрескаждый раз, когда вы запускаете программу.Если вы объявили переменную, у вас, очевидно, есть доступ к ней.Попробуйте запустить программу несколько раз.Скорее всего, вы будете каждый раз получать разные адреса.
Если у вас нет особых потребностей, таких как драйверы кодирования, ядра или встроенные системы, вам никогда не следует беспокоиться об абсолютных адресах.