Как присвоить значение с помощью адреса? - PullRequest
2 голосов
/ 28 апреля 2011

Мне задали вопрос во время интервью на языке Си. вопрос:

int *point;
'0x983234' is a address of memory;//I can not remember exactly

как мы можем присвоить 20 памяти? это похоже на вопрос встроенного программирования, может кто-нибудь объяснить мне?

Ответы [ 3 ]

7 голосов
/ 28 апреля 2011

Я подозреваю, что это вопрос встроенного программирования, и вы слегка его запомнили.Вероятно, это было что-то вроде -

int *point = (int *) 0x983234;
*point = 20;

Встраиваемые программисты делают такие вещи, когда есть регистр, который они хотят прочитать / записать по адресу 0x983234.

5 голосов
/ 28 апреля 2011

Сначала вы должны установить указатель на правильный адрес (чтобы он указывал туда, где он вам нужен). Затем, чтобы написать по этому адресу, вы разыменовываете указатель и выполняете присваивание. Это будет выглядеть примерно так:

int main ()
{
        volatile int *point = (int *)0x983234;
        *point = 20;
        return 0;
}

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

Если у вас есть больший кусок данных для хранения, используйте memcpy или memmove с этим адресом для копирования данных с / на него, например:

#include <string.h>

int main ()
{
        const char data[] = "some useful stuff";
        memcpy ((char *)0x983234, data, sizeof (data));
        return 0;
}
2 голосов
/ 15 июня 2018

Я использую этот подход, чтобы сделать это. Его преимущество в том, что вам не нужна другая переменная (указатель). предположим, что вы хотите установить переменную типа uint8_t по адресу 0x00002dbd равной 200. вы можете просто написать код:

*(uint8_t*)0x00002dbd=200;

или если у вас есть переменная uint32_t (не указатель), которая содержит адрес вашей переменной uint8_t, вы можете сделать это:

uint32_t x;
x=0x00002dbd;    
*(uint8_t*)x=200;

не имеет значения, какого типа ваша целевая переменная. просто тип вместо части uint8_t.

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