用里面的数组初始化一个struct数组

时间:2016-02-25 04:51:52

标签: c arrays struct

所以我创建了一个带有未初始化数组的结构,但外部结构是一个初始化的数组。然后我循环并打印值,但我没有得到任何东西。 NUM已定义为12。

#include "header.h"
#include <stdio.h>
#include <stdlib.h>


void make() {

struct suit {
    char *type;
    int people[];
} deck[4] = {"Hunter", NUM,
    "Fighter", NUM,
    "Jumper", NUM,
    "Strider", NUM};





};
//print type and numbers 1-12
for (int i = 0; i < 4; i++) {

    for (int j = 0; j < NUM; i++) {
        printf(deck[i].type);
        printf(deck[i].people[j]);

    }
}


}

2 个答案:

答案 0 :(得分:-1)

people是一个灵活的数组成员,标准C不允许初始化灵活的数组成员。但是,GCC允许static initialization灵活数组作为扩展。所以,

 struct suit {
    char *type;
    int people[];
 } deck = {"Hunter", NUM};  

是根据GCC的有效代码段,但同时GCC在涉及灵活的数组成员时不允许嵌套数组初始化,因此deck[4]的初始化程序无效。

  

当然,只有额外的数据出现在顶级对象的末尾时,这个扩展才有意义,否则我们会在后续的偏移量中覆盖数据。为了避免过度复杂化和深度嵌套数组初始化的混淆,我们简单地禁止任何非空初始化,除非结构是顶级对象。例如:

 struct foo { int x; int y[]; };
 struct bar { struct foo z; };

 struct foo a = { 1, { 2, 3, 4 } };        // Valid.
 struct bar b = { { 1, { 2, 3, 4 } } };    // Invalid.
 struct bar c = { { 1, { } } };            // Valid.
 struct foo d[1] = { { 1, { 2, 3, 4 } } };  // Invalid. 

另请注意,您应在printf中使用适当的格式说明符来表示不同的数据类型。

答案 1 :(得分:-1)

分配int people[];数组的内存,所以,你的结构应该是这样的,因为它是一个对象定义:

struct suit {
    char *type;
    int people[10]; //compile time allocation
} deck[4] = {"Hunter", NUM,
    "Fighter", NUM,
    "Jumper", NUM,
    "Strider", NUM};