无法从struct数组中获取引用

时间:2013-01-30 10:37:58

标签: c pointers

我从库中得到以下结构:

typedef struct
{
    unsigned char pin;              //!< Module pin.
    unsigned char function;         //!< Module function.
} gpio_map_t[]; 

现在,在我的代码中,我创建了一个结构实例:

gpio_map_t display_spi_pins = {
        {1,1},
        {2,2},
        {3,3},
        {4,4}
    };

然后我创建一个像这样的指针:

gpio_map_t* spi_pins_pointer = &display_spi_pins;

直到这里一切顺利,没有编译错误。

我想知道如何取回对display_spi_pins的引用。 我这样试试:

gpio_map_t display_spi_pins_new_reference = *spi_pins_pointer;

但我收到编译错误说:

  

数组初始化程序必须是初始化列表

修改 别忘了typedef sctruct ...来自库,我无法修改它。

4 个答案:

答案 0 :(得分:1)

您无法通过指针访问数据,在这种情况下,您可以直接使用数组访问数据 display_spi_pins

for(i=0; i<sizeof(display_spi_pins)/sizeof(display_spi_pins[0]); i++) {
    printf("pin[%d]=%X, function[%d]=%X\n",
           i, display_spi_pins[i].pin,
           i, display_spi_pins[i].function);
}

答案 1 :(得分:1)

问题是你将gpio_map_t定义为长度未定义的结构数组。做一些类似的事情:

typedef struct
{
    unsigned char pin;              //!< Module pin.
    unsigned char function;         //!< Module function.
} gpio_map_t;

gpio_map_t[] display_spi_pins = {
    {1,1},
    {2,2},
    {3,3},
    {4,4}
};

gpio_map_t** spi_pins_pointer = &display_spi_pins;
gpio_map_t* display_spi_pins_new_reference = *spi_pins_pointer;

(请记住,gpio_map_t*非常接近gpio_map_t[])。

答案 2 :(得分:0)

不要将类型别名gpio_map_t声明为数组类型。相反,当需要结构数组时,将变量声明为数组,并仅将指针用于引用。

答案 3 :(得分:0)

这就是你要找的东西:

typedef struct
{
    unsigned char pin;              //!< Module pin.
    unsigned char function;         //!< Module function.
} gpio_map_t[]; 


void main()
{
    gpio_map_t display_spi_pins = {{1,1}, {2,2}, {3,3}, {5,6}};
    gpio_map_t* spi_pins_pointer = &display_spi_pins;
    gpio_map_t* display_spi_pins_new_reference = spi_pins_pointer;

    int i;    

    for(i=0;i<4;i++){
        printf("%d: %d  %d\n",i,(display_spi_pins+i)->pin,(display_spi_pins+i)->function);

        if(((display_spi_pins+i)->pin != (*spi_pins_pointer+i)->pin) ||
            ((display_spi_pins+i)->pin != (*display_spi_pins_new_reference+i)->pin) ||
            ((display_spi_pins+i)->function != (*spi_pins_pointer+i)->function) ||
            ((display_spi_pins+i)->function != (*display_spi_pins_new_reference+i)->function))  
            printf("Reference ERROR\n");
    }
}