繁体   English   中英

C结构和数组

[英]C Structs and arrays

我无法获取下面的代码进行编译(请参见错误)。 纠正建议将不胜感激。

#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
}

您所有的错误均源于您在结构内部错误地声明了数组的事实。 必须指定数组的大小; 您不能只使用空括号。 即这将工作:

typedef struct {
    Field *fields[3];
    Prompt *prompts[3];
    unsigned numFlds;
} Form;

如果需要允许不同数量的元素,则必须使用其他方法。 例如,您可以将两个字段都用作指针:

Field **fields;
Prompt **prompts;

但是随后,您将不得不为它们动态分配和释放内存,并且您肯定将无法使用聚合初始化程序来初始化结构。

您已在struct定义中声明了数组,但未指定范围。 这是不可能的:

typedef struct {
    Field   *fields[];
    Prompt  *prompts[];
    unsigned numFlds; 
} Form;

您应该在方括号中指定一个数字,或者将其更改为指针类型: Field **fields; 始终注意,结构的大小是静态的,并且在编译时就已知,因此,其内部不能具有可变大小的数组。 但是,它可以指向可变大小的数组(因为指针具有恒定的大小)。

结构通常不能容纳类型不完整的成员(例如,没有尺寸的数组),因为编译器无法知道该成员的大小,即结构中后面成员的偏移量是不确定的。 该规则的一个例外是最后一个成员,该成员可能具有不完整的数组类型(所谓的灵活数组成员 )。

解决方案:使用固定大小的数组或指针。

下面的代码[刚刚修改并介绍了数组的大小]并且编译良好。

#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个以上的对象,则需要将其声明为双指针并分配内存并使用它。 但是在不使用它时,请确保对其进行释放/释放。 否则,将导致内存泄漏。

问题是您不能初始化长度为零的数组。

如果您将For声明更改为:

typedef struct {
    Field   *fields[100];    
    Prompt  *prompts[100];    
    unsigned numFlds;  // <<< invalid field declaration after empty field
} Form;                    // <<< in '(incomplete) struct (no name)'.

它会工作。

看起来链表结构可能最适合您的需求。

顺便说一句-提示和字段是否总是一一对应? 如果是这样,您可以将它们存储在相同的结构中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM