我正在尝试在c中编写一个结构,用于将数据存储在链接数组中,如下所示:
typedef struct
{
u8 num;
struct value* next;
}value;
value arr[4] = {
{.num = 0, .next = (value[]){
(value){.num = 0, .next = NULL},
(value){.num = 1, .next = NULL},
(value){.num = 31, .next = NULL}
}},
{.num = 1, .next = NULL},
{.num = 2, .next = NULL},
{.num = 31, .next = NULL}
};
而不是null,将链接数组最多6个层次结构级别。
我怎样才能在C中这样做?我做错了什么?
顺便说一下,整个结构应该是const
所以我需要用值初始化它,而不是在运行时再次触摸它。
如果你有一个方法可以用c ++做到这一点,我也可以使用它。
答案 0 :(得分:3)
我建议使用Boost Multidimensional数组。在C中,内存管理很快就会变得难以处理。见http://www.boost.org/doc/libs/1_63_0/libs/multi_array/doc/user.html
更麻烦的解决方案是嵌套std :: vectors:
std :: vector< std :: vector<的std ::矢量< ...>等。
答案 1 :(得分:1)
这里有两个问题:
首先,你的结构没有标签。所以struct value* next;
是指向不完整类型的指针。因此,您无法创建它们的数组。您需要将标记添加到结构中。
其次,内部数组成员的复合文字语法是不需要的,因为您已经知道您有一个该类型的数组。此外,因为这会创建单独的对象而不是充当初始化程序,所以这会产生错误,因为在文件范围内有一个对象,初始化程序不是常量。所以也要删除它。
完成这些修复后,你应该这样:
typedef struct value
{
u8 num;
struct value* next;
}value;
value arr[4] = {
{.num = 0, .next = (value[]){
{.num = 0, .next = NULL},
{.num = 1, .next = NULL},
{.num = 31, .next = NULL}
}},
{.num = 1, .next = NULL},
{.num = 2, .next = NULL},
{.num = 31, .next = NULL}
};