получить доступ к массиву с известного адреса - PullRequest
7 голосов
/ 04 апреля 2019

У меня есть код, который я передал определенное место в памяти.Это место в памяти указывает на array

uint32_t *ps2 = NULL;
uint32_t src_address = 0x1ffffc3;

Как я могу прочитать значение array с этого адреса?Я попытался разыграть его следующим образом:

*ps2 = (void *)src_address;

, но он выдает ошибку: invalid conversion from ‘void*’ to ‘uint32_t

С уважением,

Ответы [ 3 ]

8 голосов
/ 04 апреля 2019

У вас две проблемы:

  1. Прежде всего, указатель ps2 является нулевым указателем, он никуда не указывает. Это означает, что вы не можете разыменовать его.

  2. src_address не является указателем, когда это действительно должно быть.

В целом, в вашем понимании указателей и того, как они используются, возникает некоторая путаница.

Чтобы это работало, сначала определите ps2 как , а не указатель:

uint32_t ps2;

затем определите src_address как указатель:

uint32_t *src_address = (uint32_t *) 0x1ffffc3;

и, наконец, разыменование src_address как обычный указатель:

ps2 = *src_address;

Возможна третья проблема: адрес src_address не выровнен для uint32_t. В некоторых системах доступ без выравнивания недопустим и приведет к аппаратным исключениям.

0 голосов
/ 04 апреля 2019

Вы хотите дать указатель p2 while (кроме NULL).

Но здесь вы устанавливаете это значение не для самого указателя, а для памяти, на которое оно указывает.

*ps2 = (void *)src_address;

И это указывает на .... ну ничего, это нулевой указатель (адрес 0 недействителен).

Используя *, вы получаете доступ (или настройку) к значению, на которое указывает указатель. Поэтому вам нужно удалить *, чтобы изменить сам указатель.

ps2 = (void *)src_address;

Или даже лучше:

ps2 = (uint32_t*)src_address;

Затем, чтобы прочитать значение с этого адреса:

uint32_t value = *ps;
0 голосов
/ 04 апреля 2019

Это потому, что вы не можете гарантированно преобразовать тип указателя в любой целочисленный тип.6.3.2.3(p5) (emp. Mine):

Любой тип указателя может быть преобразован в целочисленный тип.За исключением случаев, указанных ранее, результат определяется реализацией. Если результат не может быть представлен целочисленным типом, поведение не определено .Результат не обязательно должен находиться в диапазоне значений любого целочисленного типа.

Неопределенное поведение вполне может быть ошибкой компиляции, которую вы видите.

Существуют выделенные типы intptr_t,uintptr_t.Они описаны в 7.20.1.4

Следующий тип обозначает целочисленный тип со знаком со свойством, что любой действительный указатель tovoid может быть преобразован в этот тип, затем преобразован обратно в указатель tovoid, и результат будет сравниватьсяравен исходному указателю

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

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