所以我创建了一个带有未初始化数组的结构,但外部结构是一个初始化的数组。然后我循环并打印值,但我没有得到任何东西。 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]);
}
}
}
答案 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};