我无法获得下面的代码进行编译(请参阅错误)。有关更正的建议将不胜感激。
#include <stdio.h>
typedef struct {
char *fldName;
unsigned fldLen;
} Field;
typedef struct {
char *fldPrompt;
unsigned startRow;
unsigned startCol;
} Prompt;
typedef struct {
Field *fields[];
Prompt *prompts[];
unsigned numFlds; <<< invalid field declaration after empty field
} Form; <<< in '(incomplete) struct (no name)'.
Field firstName = { "fName", 12 };
Field surName = { "sName", 25 };
Field gender = { "gder", 1 };
Prompt fn = { "First Name : ", 4, 10 };
Prompt sn = { "Surname : ", 6, 10 };
Prompt gn = { "Gender : ", 8, 10 };
int main (void)
{
Form aForm = { { &firstName, &surName, &gender },
{ &fn, &sn, &gn},
3 }; <<< Multiple initializers for the same element
return 0; <<< Too many initializers
}
答案 0 :(得分:8)
您的所有错误都源于您在结构中错误地声明数组的事实。你有来指定数组的大小;你不能只使用空括号。即这会奏效:
typedef struct {
Field *fields[3];
Prompt *prompts[3];
unsigned numFlds;
} Form;
如果您需要允许不同数量的元素,则必须使用其他内容。例如,您可以将两个字段都指向:
Field **fields;
Prompt **prompts;
但是你必须为它们动态分配和释放内存,你肯定无法使用聚合初始值设定项来初始化结构。
答案 1 :(得分:4)
您已在struct
定义中声明了数组,但未指定边界。这是不可能的:
typedef struct {
Field *fields[];
Prompt *prompts[];
unsigned numFlds;
} Form;
您应该在括号中指定一个数字,或者将其更改为指针类型:Field **fields;
。请注意,结构的大小是静态的,并且在编译时是已知的,因此,它本身不能具有可变大小的数组。但是,它可以指向可变大小的数组(因为指针具有恒定的大小)。
答案 2 :(得分:2)
结构通常不能保存具有不完整类型的成员(例如,没有维度的数组),因为编译器无法知道该成员的大小,即结构中后续成员的偏移量是不确定的。此规则的一个例外是最后一个成员,它可能具有不完整的数组类型(所谓的灵活数组成员)。
解决方案:使用固定大小的数组或指针。
答案 3 :(得分:0)
以下代码[刚刚修改并引入了数组的大小]并且编译得很好。
#include <stdio.h>
typedef struct {
char *fldName;
unsigned fldLen;
} Field;
typedef struct {
char *fldPrompt;
unsigned startRow;
unsigned startCol;
} Prompt;
typedef struct {
Field *fields[3];
Prompt *prompts[3];
unsigned numFlds; // invalid field declaration after empty field
} Form; // in '(incomplete) struct (no name)'.
Field firstName = { "fName", 12 };
Field surName = { "sName", 25 };
Field gender = { "gder", 1 };
Prompt fn = { "First Name : ", 4, 10 };
Prompt sn = { "Surname : ", 6, 10 };
Prompt gn = { "Gender : ", 8, 10 };
int main (void)
{
Form aForm = { { &firstName, &surName, &gender },
{ &fn, &sn, &gn},
3 }; // Multiple initializers for the same element
return 0; // Too many initializers
}
此外,如果你想在第15行中超过3,那么你需要声明它是双指针并分配内存并使用它。但是确保在不使用它时解除分配/释放它。否则,将导致内存泄漏。
答案 4 :(得分:0)
问题是您无法初始化零长度数组。如果您将For声明更改为:
typedef struct {
Field *fields[100];
Prompt *prompts[100];
unsigned numFlds; // <<< invalid field declaration after empty field
} Form; // <<< in '(incomplete) struct (no name)'.
它会起作用。
答案 5 :(得分:0)
看起来链表结构可能最适合您的需求。
顺便说一句 - 提示和字段是否始终一对一映射?如果是这样,你可以将它们存储在同一个结构中。