取消引用的指针更改函数调用中的地址

Dereferenced pointer changes address in function call

我在内存中声明并设置了一个结构,我有一个指向该结构的全局常量指针,并且在我的整个程序中我取消引用该指针以访问该结构的不同部分。但是,有时从特定函数取消引用时指针内存地址会发生变化。

我的结构

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;

为了从 'notificationConfig' 数组获取通知,我通过 [1]:

取消引用 'theConfigData'
const notificationConfig_t *pNotificationConfig = theConfigData->notificationConfig + notificationID;

单步执行 uC 上的代码时出现以下情况:

  1. 在函数A中,使用[1]从struct获取通知,指针地址为0x463e18
  2. 在函数A调用函数B中,使用[1]解引用结构地址变为0x463e2a(这是错误的内存地址,0x12的差异)
  3. 函数 B 完成并且 returns 到 A,使用 [1] 再次取消引用 ConfigData 给出 0x463e18
  4. 程序中使用 [1] 的所有其他函数总是 returns 正确的 (0x463e18) 地址。

函数 B 不会以任何方式改变 'theConfigData'。在调试器内存视图中,0x0460000 + sizeOf(configData_t) 中的数据没有任何改变。

从函数 A 到 B 时,'pNotificationConfig' 指针如何更改地址?

您需要确保:

  • 函数A和函数B编译单元中configData_t的定义完全相同
  • 函数A和函数B的编译单元configData_tstruct padding完全一样

以上针对您的具体问题的危险信号是,例如。 :

  • sizeof(configData_t)不同
  • offsetof(configData_t, notificationConfig)不同
  • sizeof(notificationConfig_t)不同

如果出现一个或多个这些危险信号(并在评论中确认),您需要确定是前面两个选项中的哪一个导致了它:

  • 可以通过验证源代码来发现定义上的差异:
    • 确保在整个代码中使用相同的结构定义(通常使用包含文件)
    • 确保支持的编译时值相同(例如,数组维度 MAX_INPUTMAX_OUTPUT、...在您的情况下)
  • 填充的不同可能是由于使用不同的编译器and/or不同的编译器标志 - 请参阅编译器的文档了解详细信息(特别是 wrt.struct padding/packing)