【问题标题】:Initialize array of structures初始化结构数组
【发布时间】:2015-07-29 00:25:36
【问题描述】:

我在初始化 C 中的结构数组时遇到问题。 这是我的结构:

typedef struct Voie {
    int num;
    int sem_num[3];
    int crois[3];
} Voie;

这两个数组将包含 0、2 或 3 个整数。

我有一个包含 12 个“Voie”的数组:

Voie voies[12];

并且我希望用这些参数初始化它们中的每一个:

{1,{0,16,1},{4,7,8}}
{2,{2,3},{4,5}}
{3,{},{}}
{4,{4,17,5},{7,10,11}}
{5,{6,7},{7,8}}
{6,{},{}}
{7,{8,17,9},{10,1,2}}
{8,{10,11},{10,11}}
{9,{},{}}
{10,{12,16,13},{1,4,5}}
{11,{14,15},{1,2}}
{12,{},{}}

我尝试使用返回结构的函数,用开关分隔每个案例,但遇到了重新定义问题。 然后我找到了我认为是最好的解决方案,但仍然无法运行:

int cas[][] = { {1,{0,16,1},{4,7,8}},
                    {2,{2,3},{4,5}},
                    {3,{},{}},
                    {4,{4,17,5},{7,10,11}},
                    {5,{6,7},{7,8}},
                    {6,{},{}},
                    {7,{8,17,9},{10,1,2}},
                    {8,{10,11},{10,11}},
                    {9,{},{}},
                    {10,{12,16,13},{1,4,5}},
                    {11,{14,15},{1,2}},
                    {12,{},{}}  };

for (i=0 ; i<12 ; i++) {
    voies[i] = cas[i];
}

我什至不确定这是否可能,因为以下工作:

Voie v = {1,{0,16,1},{4,7,8}};

但不是以下:

int tab[] = {1,{0,16,1},{4,7,8}};
Voie v = tab;

另外:初始化后如何访问结构中的每个元素?

感谢您的帮助。

【问题讨论】:

  • 是什么导致你这样做:int cas[][]?
  • 这是另一个帖子中给出的解决方案。问题和我的差不多。
  • 这么多重复我不知道用哪一个来关闭它。
  • 所以你可能想链接这个答案?
  • 对不起,我明白你的意思。我正在谈论的答案没有说 int cas[][] 而是 int cas[][9] 但由于我不知道我的情况是什么大小,所以我让它为空。 stackoverflow.com/a/22927133/4403802

标签: c arrays dynamic struct initialization


【解决方案1】:

你可以简单地初始化你的数组:

编辑:

Voie voies[12] = { 
                {1,{0,16,1},{4,7,8}},
                {2,{2,3,},{4,5,}},
                {3,{0,},{0,}},
                {4,{4,17,5},{7,10,11}},
                {5,{6,7,},{7,8,}},
                {6,{0,},{0,}},
                {7,{8,17,9},{10,1,2}},
                {8,{10,11,},{10,11,}},
                {9,{0,},{0,}},
                {10,{12,16,13},{1,4,5}},
                {11,{14,15,},{1,2,}},
                {12,{0,},{0,}}  
};

【讨论】:

  • 值得一提的是,在这种情况下,所有未显式初始化的成员/元素都被隐式初始化为0
  • 还值得一提的是,这不是标准的C。不允许空{}。 (它们用于 C++)
  • 这使得这个答案完全错误。那里有足够多的 C 编译器会完全拒绝它作为语法错误。 (即使问题中也有错误,也应该提及。)
  • 感谢编辑,现在看起来不错(无论如何对我来说)。值得一提的还有@alk 暗示的内容:您可以简单地写{3},{3,},,而不是{3,{0,},{0,}},。但如果你更喜欢现在的方式,那也没关系。
  • 基本上我想为数组的每个元素做一些事情。所以目前我正在使用一个for循环,从0到2,但是如果数组为空,我不想做任何事情,如果它只包含2个元素,我只想做2次。所以我无论如何都要用 3 个元素初始化数组,这会导致一些 {-1,-1,-1}{1,2,-1} 并且我在 for 循环中测试值,并且只有当它不同于 -1 时才执行操作。最好的方法是什么?
【解决方案2】:

您的声明 cas[][] 和您使用空 {} 的初始化都不是标准 C。

您最多可以在声明中包含一个空的[],并且您必须在{} 中放置至少一个0

【讨论】:

    【解决方案3】:

    您可以访问 voies[5].sem_num[0] 等元素。

    如果我没记错,上面的示例值为 17。

    【讨论】:

    • 在原始示例中,voies[5].sem_num[0] 为零。你可能知道voies[6].sem_num[1] 是 17。
    • 没错,玛丽安。我只是想看看是否每个人都在关注...:P(JK,我的错误!感谢您指出!)@Scentle5S,不要像我那样做,好吗?
    猜你喜欢
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    相关资源
    最近更新 更多