У меня есть структура, объявленная и установленная в памяти, у меня есть глобальный постоянный указатель на эту структуру, и во всей моей программе я разыменую этот указатель для доступа к различным частям структуры. Однако бывают случаи, когда адрес памяти указателя изменяется при разыменовании у определенной функции.
Моя структура
typedef struct configData_t
{
uint8_t version[4];
inputConfig_t inputModuleConfig [MAX_INPUT];
outputConfig_t outputModuleConfig [MAX_OUTPUT];
notificationConfig_t notificationConfig [MAX_NOTIFICATIONS];
functionConfig_t autoFunctionConfig [MAX_FUNCTIONS];
uint16_t Crc16;
} configData_t;
Указатель константы объявляется путем установки адреса памяти данных (загружаемых извне и вне памяти приложений)
//Pointer points to memory location on uC (data already in memory)
const configData_t* theConfigData = (configData_t*)0x0460000;
Чтобы получить уведомление из массива «messagesConfig», я разыменую «theConfigData» на [1]:
const notificationConfig_t *pNotificationConfig = theConfigData->notificationConfig + notificationID;
При пошаговом выполнении кода на uC происходит следующее:
- В функции A получить уведомление от struct с помощью [1], адрес указателя 0x463e18
- В функции A, вызывающей функцию B, разыменяем структуру, используя [1], адрес меняется на 0x463e2a (Это неправильный адрес памяти, разница 0x12)
- Функция B завершается и возвращается к A, снова разыменовывая ConfigData, используя [1], дает 0x463e18
- Каждая другая функция в программе, которая использует [1], всегда возвращает правильный (0x463e18) адрес.
Функция B никоим образом не изменяет theConfigData. В представлении памяти отладчиков данные в 0x0460000 + sizeOf (configData_t) никак не изменяются.
Как указатель pNotificationConfig меняет адрес при переходе от функции A к B?