通过指针访问结构中的结构

时间:2017-11-09 14:42:13

标签: c pointers debugging structure handle

简要说明: 我通过指针编写了一些东西来构造,但是其他东西被写入。我在atollic true studio 8.1工作,为STM32F415RG MCU编程。

最奇怪的是,即使我查看变量和表达式窗口,我也可以看到具有不同值的相同结构。 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;

我把它传递给我的协议init函数,该函数将一个指针作为参数处理:

Escom_Protocol_Init(&hprot1);

初始化函数将其传递给RS485驱动程序初始化函数,该函数将指针指向RS485句柄作为参数(此调用简化了很多):

void Escom_Protocol_Init(EscomProtocolHandle* protocol_handle)
{
  RS485_Init(&protocol_handle->master_rs485)
}

RS485 init函数设置默认值:

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 的地址与 hprot1 句柄的 master_rs485 成员的地址相匹配。 P.S。:我没有搞砸任何上述结构的包装(#pragma pack),所以这应该不是问题。

1 个答案:

答案 0 :(得分:1)

知道了! 有一个看似无关的头文件,其中包含一个结构原型,它被打包(1)并且在structre prototype之后没有#pragma pack()来将打包恢复到默认状态。因此,RS485DriverHandle在不同的地方被打包得不同。在Escom_Protocol_InitRS485_Init中,句柄结构的地址是相同的,但打包是不同的,例如GPIO_TypeDef* dir_gpio成员的地址在Escom_Protocol_Init中是0x200000D6但是RS485_Init中的0x200000D9。