通过指针访问结构中的结构
Accessing structure in structure through pointer
简要说明:
我通过指针写了一些东西来构造,但写了其他东西。我在 atollic true studio 8.1 工作,对 STM32F415RG MCU 进行编程。
最奇怪的是,即使我查看变量和表达式window,我也能看到具有不同值的相同结构。
Same variable in two windows with different values
现在详细说明一下(我将简化很多内容以使其更具可读性)。
我定义了协议句柄类型:
typedef struct
{
RS485DriverHandle master_rs485;
} EscomProtocolHandle;
我的RS485驱动句柄定义如下:
typedef struct
{
UART_HandleTypeDef* uart_handle;
TransceiverState transceiver_state;
GPIO_TypeDef* dir_gpio;
uint16_t dir_pin;
} RS485DriverHandle;
我已将协议句柄创建为全局变量:
static EscomProtocolHandle hprot1;
我将它传递给我的协议初始化函数,该函数将一个指针作为参数处理:
Escom_Protocol_Init(&hprot1);
Init 函数将其传递给 RS485 驱动程序 init 函数,该函数将指向 RS485 句柄的指针作为参数(此调用简化了很多):
void Escom_Protocol_Init(EscomProtocolHandle* protocol_handle)
{
RS485_Init(&protocol_handle->master_rs485)
}
RS485 初始化函数设置默认值:
void RS485_Init(RS485DriverHandle* rs485_handle, UART_HandleTypeDef* uart_handle,
GPIO_TypeDef* dir_gpio, uint16_t dir_pin)
{
/* default = listening */
rs485_handle->uart_handle = uart_handle;
rs485_handle->dir_gpio = dir_gpio;
rs485_handle->dir_pin = dir_pin;
ReceiverOutputEnable(rs485_handle);
rs485_handle->transceiver_state = kReceiving;
}
现在,如果我查看局部变量 rs485_handle,值设置正确。但是如果我查看我的句柄 hprot1,值不匹配。即使 rs485_handle 的地址匹配 master_rs485 成员的地址 hprot1句柄。
P.S.: 我没有弄乱上述任何结构的包装(#pragma pack),所以这应该不是问题。
知道了!
有一个看似无关的头文件,里面有一个结构原型,它是 packed(1) 并且在 structre 原型之后没有 #pragma pack()
来恢复包装到默认状态。因此 RS485DriverHandle
在不同的地方以不同的方式包装。在 Escom_Protocol_Init
和 RS485_Init
中,句柄结构的地址相同,但封装不同,例如 GPIO_TypeDef* dir_gpio
成员的地址在 Escom_Protocol_Init
中是 0x200000D6 但RS485_Init
.
中的 0x200000D9
简要说明: 我通过指针写了一些东西来构造,但写了其他东西。我在 atollic true studio 8.1 工作,对 STM32F415RG MCU 进行编程。
最奇怪的是,即使我查看变量和表达式window,我也能看到具有不同值的相同结构。 Same variable in two windows with different values
现在详细说明一下(我将简化很多内容以使其更具可读性)。 我定义了协议句柄类型:
typedef struct
{
RS485DriverHandle master_rs485;
} EscomProtocolHandle;
我的RS485驱动句柄定义如下:
typedef struct
{
UART_HandleTypeDef* uart_handle;
TransceiverState transceiver_state;
GPIO_TypeDef* dir_gpio;
uint16_t dir_pin;
} RS485DriverHandle;
我已将协议句柄创建为全局变量:
static EscomProtocolHandle hprot1;
我将它传递给我的协议初始化函数,该函数将一个指针作为参数处理:
Escom_Protocol_Init(&hprot1);
Init 函数将其传递给 RS485 驱动程序 init 函数,该函数将指向 RS485 句柄的指针作为参数(此调用简化了很多):
void Escom_Protocol_Init(EscomProtocolHandle* protocol_handle)
{
RS485_Init(&protocol_handle->master_rs485)
}
RS485 初始化函数设置默认值:
void RS485_Init(RS485DriverHandle* rs485_handle, UART_HandleTypeDef* uart_handle,
GPIO_TypeDef* dir_gpio, uint16_t dir_pin)
{
/* default = listening */
rs485_handle->uart_handle = uart_handle;
rs485_handle->dir_gpio = dir_gpio;
rs485_handle->dir_pin = dir_pin;
ReceiverOutputEnable(rs485_handle);
rs485_handle->transceiver_state = kReceiving;
}
现在,如果我查看局部变量 rs485_handle,值设置正确。但是如果我查看我的句柄 hprot1,值不匹配。即使 rs485_handle 的地址匹配 master_rs485 成员的地址 hprot1句柄。 P.S.: 我没有弄乱上述任何结构的包装(#pragma pack),所以这应该不是问题。
知道了!
有一个看似无关的头文件,里面有一个结构原型,它是 packed(1) 并且在 structre 原型之后没有 #pragma pack()
来恢复包装到默认状态。因此 RS485DriverHandle
在不同的地方以不同的方式包装。在 Escom_Protocol_Init
和 RS485_Init
中,句柄结构的地址相同,但封装不同,例如 GPIO_TypeDef* dir_gpio
成员的地址在 Escom_Protocol_Init
中是 0x200000D6 但RS485_Init
.