无法解析代码中的结构内容

时间:2017-03-15 20:07:06

标签: c list struct

我试图在一个Structure中累积所有类型的列表,并从该结构中引用每个列表而不是使用不同的结构名称

    #include <stdio.h>
    #define TRUE 1
    #define FALSE 0

    typedef struct test_s {
        int    val;
        int     p;
    }test_t;

    test_t list_1[] = {
            { TRUE, 1},
            { TRUE, 2},
            { TRUE, 3}
    };

    test_t  list_2[] = {
            {FALSE, 1},
            {TRUE , 2},
            {TRUE , 3}
    };

    test_t list_types[][] = { list_1, list_2 };
    test_t *list = NULL;

    void
    main() {

        list = list_types[0];

        int iter = 0;
        for ( iter = 0; iter < sizeof(list)/sizeof(list[0]); iter++){
            printf("Bool: %d Val: %d\n",list[0].val, list[0].p);
        }
    }
我是 当我尝试编译时,我收到了以下错误。请突出显示我在此代码段中缺少的内容

test.c:22:8: error: array type has incomplete element type

2 个答案:

答案 0 :(得分:0)

编辑回答有关初始化的问题:
正如我在你的帖子中的评论中提到的,你的&#39; list_types`变量的初始化是不正确的。

使用原始版本的list_types变量:

test_t **list_types = { list_1, list_2 };

我的编译器抛出错误:

  

Invalid initialization type;found指向指向test_t的指针的test_t expected 指针

使用此版本(稍后编辑):

test_t list_types[][] = { list_1, list_2 };

我的编译器抛出错误:

  

多维数组的更高维度缺少数组大小。

这些初始化都不起作用。将初始化的形式更改为:

test_t *list_types[] = { list_1, list_2 };

并且它不会抛出任何错误,并且包含`test_t的两个实例。

结束编辑。

...从该结构中引用每个而不是使用不同的名称...

通过如上所示进行初始化,您现在可以使用如下所示的相同名称来引用每个结构:

....
//test_t **list_types = { list_1, list_2 };//incorrect initialization...
test_t *list = NULL;

void main(void) {

    list = &list_1[0]; //assign list_1 to list

    int iter = 0;
    for ( iter = 0; iter < 3; iter++){
        printf("Bool: %d Val: %d\n",list[iter].val, list[iter].p);
    }


    list = &list_2[0];//assign list_2 to list

    iter = 0;
    for ( iter = 0; iter < 3; iter++){
        printf("Bool: %d Val: %d\n",list[iter].val, list[iter].p);
    }
    getchar();//stops execution in my environment
}

以下说明了list实例的内容:

首次转让后:

enter image description here

第二次任命后:

enter image description here

答案 1 :(得分:0)

实际上,您想要创建一个struct-pointer数组。

第1步 - 使用。声明并初始化数组。

test_t *list_types[] = { list_1, list_2 };

而不是:

test_t list_types[][] = { list_1, list_2 };

第2步 - 使用该数组而不是指向该数组的指针到现在的大小。

  

使用索引iterlist_1list_2之间进行选择,   否则您将访问list_1

     

要访问一个list_<x>的所有项目,有必要存储   大小

for ( iter = 0; iter < sizeof(list_types)/sizeof(list_types[0]); iter++){
    list = list_types[iter];
    printf("Bool: %d Val: %d\n",list[0].val, list[0].p);
}

而不是:

for ( iter = 0; iter < sizeof(list)/sizeof(list[0]); iter++){
    printf("Bool: %d Val: %d\n",list[0].val, list[0].p);
}