簡體   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