取消引用的指针更改函数调用中的地址
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 上的代码时出现以下情况:
- 在函数A中,使用[1]从struct获取通知,指针地址为0x463e18
- 在函数A调用函数B中,使用[1]解引用结构地址变为0x463e2a(这是错误的内存地址,0x12的差异)
- 函数 B 完成并且 returns 到 A,使用 [1] 再次取消引用 ConfigData 给出 0x463e18
- 程序中使用 [1] 的所有其他函数总是 returns 正确的 (0x463e18) 地址。
函数 B 不会以任何方式改变 'theConfigData'。在调试器内存视图中,0x0460000 + sizeOf(configData_t) 中的数据没有任何改变。
从函数 A 到 B 时,'pNotificationConfig' 指针如何更改地址?
您需要确保:
- 函数A和函数B编译单元中
configData_t
的定义完全相同
- 函数A和函数B的编译单元
configData_t
的struct padding完全一样
以上针对您的具体问题的危险信号是,例如。 :
sizeof(configData_t)
不同
offsetof(configData_t, notificationConfig)
不同
sizeof(notificationConfig_t)
不同
如果出现一个或多个这些危险信号(并在评论中确认),您需要确定是前面两个选项中的哪一个导致了它:
- 可以通过验证源代码来发现定义上的差异:
- 确保在整个代码中使用相同的结构定义(通常使用包含文件)
- 确保支持的编译时值相同(例如,数组维度
MAX_INPUT
、MAX_OUTPUT
、...在您的情况下)
- 填充的不同可能是由于使用不同的编译器and/or不同的编译器标志 - 请参阅编译器的文档了解详细信息(特别是 wrt.struct padding/packing)
我在内存中声明并设置了一个结构,我有一个指向该结构的全局常量指针,并且在我的整个程序中我取消引用该指针以访问该结构的不同部分。但是,有时从特定函数取消引用时指针内存地址会发生变化。
我的结构
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 上的代码时出现以下情况:
- 在函数A中,使用[1]从struct获取通知,指针地址为0x463e18
- 在函数A调用函数B中,使用[1]解引用结构地址变为0x463e2a(这是错误的内存地址,0x12的差异)
- 函数 B 完成并且 returns 到 A,使用 [1] 再次取消引用 ConfigData 给出 0x463e18
- 程序中使用 [1] 的所有其他函数总是 returns 正确的 (0x463e18) 地址。
函数 B 不会以任何方式改变 'theConfigData'。在调试器内存视图中,0x0460000 + sizeOf(configData_t) 中的数据没有任何改变。
从函数 A 到 B 时,'pNotificationConfig' 指针如何更改地址?
您需要确保:
- 函数A和函数B编译单元中
configData_t
的定义完全相同 - 函数A和函数B的编译单元
configData_t
的struct padding完全一样
以上针对您的具体问题的危险信号是,例如。 :
sizeof(configData_t)
不同offsetof(configData_t, notificationConfig)
不同sizeof(notificationConfig_t)
不同
如果出现一个或多个这些危险信号(并在评论中确认),您需要确定是前面两个选项中的哪一个导致了它:
- 可以通过验证源代码来发现定义上的差异:
- 确保在整个代码中使用相同的结构定义(通常使用包含文件)
- 确保支持的编译时值相同(例如,数组维度
MAX_INPUT
、MAX_OUTPUT
、...在您的情况下)
- 填充的不同可能是由于使用不同的编译器and/or不同的编译器标志 - 请参阅编译器的文档了解详细信息(特别是 wrt.struct padding/packing)