2010-12-02 4 views
0

私は "レコード"の二重リンクリストを生成するCプログラムを開発中です。次のように特定の長さの配列から構造体を作ることはできますか?

は私が試作した私の構造体を持っている:

struct custRec(char[20] name, char[50] address, char[20] city, 
     char[2] stateAbbreviation, int zipCode, float balance); 
struct linkedRec(custRec storedRec, custRec* nextRec, custRec* prevRec); 

具体的には、私のcustRec構造体のために、それはchar[20]名前の代わりchar[]名前を使用することが有効なのですか?

「有効」とは、「名前」フィールドを正確に19文字(ヌルターミネータ)に制限しようとしていることを意味します。私は他の場所で長さについて心配する必要があり、構造体は任意の長さのchar配列を受け入れるようにしますか?

+0

これら2つのオプションの違いはごくわずかです。 – Falmarri

答えて

2

この構文は、(彼らは関数宣言ではなく、構造体の定義のように見えるので、私は最初の質問を読み違える)間違っています:

struct custRec(char[20] name, char[50] address, char[20] city, 
     char[2] stateAbbreviation, int zipCode, float balance); 
struct linkedRec(custRec storedRec, custRec* nextRec, custRec* prevRec); 

おそらく意味:

typedef struct custRec 
{ 
    char name[20]; 
    char address[50]; 
    char city[20]; 
    char stateAbbreviation[2]; 
    int zipCode; 
    float balance; 
} custRec; // Necessary because question is about C, not C++ 

typedef struct linkedRec 
{ 
    custRec storedRec; 
    custRec *nextRec; 
    custRec *prevRec; 
} linkedRec; 

私がいることに注意してください米国の州の略語は2文字ですので、nullを終了できるようにするには、おそらくchar state[3]を使用する必要があります。

これは構文上有効です。 custRecのフィールドにデータをコピーするときは、コピーが境界をオーバーフローしないように注意する必要があります。コンパイラは長さを強制しません。

したがって、渡された文字列が期待する制限を超えないように、関数内でチェックする必要があります。

長さに制限を適用したくない場合は、すべての文字列構造体メンバーをchar *にすることができ、任意の長さの文字列に動的にメモリを割り当てることができます。しかし、それはおそらく米国の州略語のための良い考えではありません。そこには '2文字プラス'\0''の制限が適用されます。

+0

ありがとうございます。あなたは州の略称についても正しいです。 –

0

説明したように、固定長文字列の構造体を宣言するのは一般的です。すべての操作で長さを超えないようにし、フィールドを正しく終了させるように十分に注意する必要があります。さもなければ、あなたはあらゆる種類の奇妙なバグを得るでしょう。

はい、char[]ではなく、char[20]を指定する必要があります。データの領域を予約する必要があるためです。

ただし、これによりこれらのフィールドには任意の上限が設定され、後で拡張するのがはるかに難しくなります。通常のchar*フィールドを持ち、ヒープに文字列を割り当てると、長さの文字列を処理できます。これにはメモリ管理にも注意が必要です(特にクリーンアップ!)。

関連する問題