Разыменованный указатель меняет адрес в вызове функции - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть структура, объявленная и установленная в памяти, у меня есть глобальный постоянный указатель на эту структуру, и во всей моей программе я разыменую этот указатель для доступа к различным частям структуры. Однако бывают случаи, когда адрес памяти указателя изменяется при разыменовании у определенной функции.

Моя структура

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 происходит следующее:

  1. В функции A получить уведомление от struct с помощью [1], адрес указателя 0x463e18
  2. В функции A, вызывающей функцию B, разыменяем структуру, используя [1], адрес меняется на 0x463e2a (Это неправильный адрес памяти, разница 0x12)
  3. Функция B завершается и возвращается к A, снова разыменовывая ConfigData, используя [1], дает 0x463e18
  4. Каждая другая функция в программе, которая использует [1], всегда возвращает правильный (0x463e18) адрес.

Функция B никоим образом не изменяет theConfigData. В представлении памяти отладчиков данные в 0x0460000 + sizeOf (configData_t) никак не изменяются.

Как указатель pNotificationConfig меняет адрес при переходе от функции A к B?

1 Ответ

0 голосов
/ 19 ноября 2018

Вы должны убедиться, что:

  • определение configData_t одинаково в единицах компиляции функции A и функции B
  • struct padding из configData_t абсолютно одинаков как для модулей компиляции функции A, так и для функции B

Красные флажки выше для вашей конкретной проблемы будут, например,. :

  • sizeof(configData_t) отличается
  • offsetof(configData_t, notificationConfig) отличается
  • sizeof(notificationConfig_t) отличается

Если один или несколько из этих красных флажков подняты (и в комментарии вы подтверждаете это), вам необходимо определить, какой из двух предыдущих вариантов вызывает это:

  • разницу в определении можно уловить, проверив исходный код:
    • убедитесь, что одни и те же определения структуры используются во всем коде (обычно с использованием включаемого файла)
    • убедитесь, что поддерживаемые значения времени компиляции одинаковы (например, размеры массива MAX_INPUT, MAX_OUTPUT, ... в вашем случае)
  • разница в заполнении может быть вызвана использованием разных компиляторов и / или разных флагов компилятора - подробности см. В документации вашего компилятора (особенно в отношении структуры / заполнения)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...