首页 > 解决方案 > 取消引用指向结构的指针 - 使间接操作数无效?

问题描述

我想取消引用指向结构的指针。此代码使用 COSMIC 编译器编译并下载到 STM8S 微控制器。

以下是我在代码中的问题:

typedef struct GPIO_struct
{
  volatile unsigned char CR1; 
  volatile unsigned char CR2; 
}
GPIO_TypeDef;


void GPIO_DeInit(GPIO_TypeDef* GPIOx)
{
          // This variable will be used for a testing purpose
          GPIO_TypeDef vGPIO = (GPIO_TypeDef)*GPIOx; // HERE IS THE PROBLEM
}

int main(void)
{
    GPIO_TypeDef GPIOY @0x5000; // Reference to an absolute address

    GPIO_DeInit(&GPIOY);
}

当我尝试此代码时,会发生错误:invalid indirection operand. 为什么编译器会拒绝这段代码?

注:代码基于STM标准库。

更新:

我知道我可以使用->运算符访问结构成员,但出于某些测试目的,我仍然想将结构成员保存在与结构相同类型的变量中。我只想在这个时间点获得寄存器的快照。

更新 2

使用上面发布的代码,我得到另一个错误invalid cast type

当我删除演员表时,它会编译。

但是不明白为什么!!有人可以解释一下吗

标签: cpointersstructdereference

解决方案


最初的错误似乎是由参数名称中的印刷错误引起的。假设标识符GPIOX是在您的真实代码中定义的,即使您没有在问题中提出这样的声明,所以您会得到“无效间接”错误,而不是调用未知标识符。

关于您的更新 2,您的编译器很挑剔,但它是正确的。C 要求强制转换表达式

除非类型名称指定 void 类型,否则类型名称应指定原子的、合格的或不合格的标量类型,并且操作数应具有标量类型。

C2011 6.5.4/2;强调添加)

在您的情况下,类型名称指定结构类型(因此不是标量类型),因此您的代码不符合要求。当然,无论如何都不需要强制转换,因为其操作数的类型已经与强制转换中指定的类型名称相同。

gcc将为我发出警告,但仅在-pedantic选项生效时。其他符合标准的编译器可以自由地拒绝代码。


推荐阅读