结构数组中的指针问题

问题描述 投票:0回答:1

这是我放在微控制器上的 C 问题。

我有一个结构体,其中包含我的硬件实例“节点”的值,每个值都与一个“寄存器”相关。

“寄存器”是一个包含读/写权限详细信息的结构。状态标志...等以及指向 Node 结构中相关值的指针。

我有一个这些寄存器的数组。请参阅下面的代码:

typedef struct
{
    uint8_t         Address;
    uint32_t        *Value; 
    typebool        ReadOnly;
    uint8_t         Type;
    typebool        QueryRequest; //Has host queried this register?
    typebool        UpdateOccured; //has a register been updated?
} typeRegister;

struct typeNode
{
    uint32_t    FlagSetter;
    uint32_t    FlagClearer;
    uint32_t    Flags;
    uint32_t    Colour;
    uint32_t    HeldFor;
    uint32_t    Team;
    uint32_t    UpdateOccured; //has a register been updated?
} Node;


typeRegister Registers[6] = 
{
    {0,&Node.FlagSetter,False,type_int32,False,False},
    {1,&Node.FlagClearer,False,type_int32,False,False},
    {2,&Node.Flags,False,type_int32,False,False},
    {3,&Node.Colour,False,type_int32,False,False},
    {4,&Node.HeldFor,False,type_int32,False,False},
    {5,&Node.Team,False,type_int32,False,False}
};

根据我对指针的理解,这应该允许使用语法

uint32_t Value3 = *Registers[3].Value
*Registers[3].Value = 100
访问寄存器值。

但是,当我尝试执行此操作时,值从未被正确分配或读取。

但是,如果我在运行时分配指针(即

Registers[3].Value = &Node.Colour;
),它确实可以工作。

在运行时之外声明结构内的指针是否有限制?


我已经完成了一堆值和指针设置、获取和分配,似乎如果我在运行时分配 Registers[n].Value = &Node.Colour,它就可以工作,但如果在编译时分配它就不行了:

                    uint32_t Value = 0;
                    Value = Node.Colour; // Value == 0xAB || &Node.Colour == 0x0047
                    
                    uint32_t *ValuePtr;
                    ValuePtr = &Node.Colour; // ValuePtr == 0x0047  |  *ValuePtr == 0xAB
                    
                    uint32_t Value2 = *ValuePtr; // Value2 == 0xAB
                    
                    uint32_t Value3 = *Registers[3].Value; // Value3 == 0xFE04FE00
                    
                    uint32_t *ValuePtr2; 
                    ValuePtr2 = Registers[3].Value; // ValuePtr2 == 0x0000  |  *ValuePtr2 = 0x00470000 <-- WRONG
                    
                    Registers[3].Value = &Node.Colour; // Assign pointer at run time
                    
                    uint32_t *ValuePtr3; 
                    ValuePtr3 = Registers[3].Value; // ValuePtr3 == 0x0047 |  *ValuePtr3 == 0xAB <-- RIGHT

为任何帮助干杯。

arrays c pointers struct embedded
1个回答
0
投票

在 C 中,数组本质上是内存中数据的集合,您赋予该数组的变量名称是指向第一个元素的指针,然后您可以对其进行索引。我相信你已经知道了,我只是想打基础。

当您像这样引用指针时

*Registers[3].Value = 100
,C 按照从左到右的顺序进行。

因为首先您使用

*Registers
引用指向数组的指针,然后使用
[3]
索引取消引用的数组指针,因此您实际上是在索引第一个元素,然后使用 3 索引第一个元素。

如果您只是用一些简单的参数包围它应该可以解决您的问题:

*(Registers[3]).Value = 100

© www.soinside.com 2019 - 2024. All rights reserved.