пустой указатель - загрузить структуру из flash - PullRequest
0 голосов
/ 14 марта 2019

У меня есть пример кода со структурой, хранящейся во флэш-памяти микроконтроллера AVR.

const MyStruct PROGMEM Struct =
{
   .MemberA = 1,
   .MemberB = 2,
}

Адрес этой структуры загружается с помощью этой функции:

const void* StructAddr;
Load(&StructAddr);

void Load(const void** Address)
{
   const void* Temp = NULL;
   Temp = &Struct;
   *Address = Temp;
}

В чем причина пустого указателя в этом случае? Если я попробую так

const intptr_t StructAddr;
Load(&StructAddr);
void Load(const intptr_t Address)
{
   const void* Temp = NULL;
   Address = &Struct;
}

содержание StructAddr составляет 0x00. Зачем? В чем разница между этими двумя решениями?

1 Ответ

2 голосов
/ 14 марта 2019

Я не знаком с флэш-памятью в контроллере AVR, но в C мы обычно используем void*, чтобы указать часть памяти, которую мы не знаем, какой тип она содержит (в отличие, например, от *). 1002 * представляет адрес фрагмента памяти, где его содержимое следует интерпретировать как int).

В первой функции передается void**: вы передаете адрес, на котором находится переменная типа void*, затем, выполнив *Address = Temp;, заполняете область памяти, указанную Address (таким образом, из функция переменная обновляется).

Во второй функции вы передали intptr_t: здесь тот же трюк не работает, так как вы присваиваете локальной копии адреса памяти StructAddr новое значение, которое затем отбрасывается после завершения функции.

Как сказано в других комментариях, вам нужно intptr_t* в сигнатуре второй функции и вам необходимо выполнить следующее *Address = Temp.

...