構造体および構造体メンバーの配列要素


8

Cでの構造体宣言について質問したい。たとえば、

struct Person
{
    char name[50];
    int citNo;
    float salary;
} prsn[20];

何をし[20]ますか?どういう意味ですか?名前を20(50から)に制限しますか、それともprsnfrom prsn[1]を制限しprsn[20]ますか?

そして、私がこのようなコードを書いた場合:

struct Person
{
    char name[50];
    int citNo;
    float salary;
};
struct Person prsn[20];

同じことをしますか?


3
それらは同じです:両方とも20タイプの要素の配列を宣言しますstruct Person
LPs

それはint prsn[20];intの代わりにPerson構造体を除いてのようです
MM

回答:


8

[20]は何をしますか?どういう意味ですか?

以下のコメントは、構造体の部分の一般的な命名法を示しています

struct Person {    //struct name (Person)
    char name[50]; // \
    int citNo;     //  --struct members 
    float salary;  // /
} prsn[20];        // instance of struct Person array

[20]このインスタンスがことを示しているstruct Person3員の20点の別個のコレクションの配列です。配列の各要素には、配列表記を使用してアクセスできます。たとえば、ループでは:

int main(int argc, char *argv[])
{
    for(int i=0;i<20;i++)// note i goes from 0 to 19
    {
        //.....
        //assuming members have been populated
        printf( "%d)\nName is: %d\ncitNo is: %d salary is: %f\n\n", prsn[i].name, prsn[i].citNo, prsn[i].salary);
    }

    return 0;
}

[20]は名前を20に(50から)制限しますか、それともprsnfrom prsn[1]をに制限しprsn[20]ますか?

メンバーname[50]は50文字の配列を定義します。そのサイズは[20]、構造体の配列のサイズを設定するために使用されるインデックスの影響を受けません。つまり、あなたはそれが定義されているとして、そこの20のインスタンスであるprsn、3つのメンバーを含む各インスタンスは: char [50]intfloat。そして、あなたの定義によって、によって作成された20件の事例では[20]、配列からインデックス値でアクセスすることができ019。(上記のループ図を参照してください。)

コメントでOPの質問に対処するための編集

要素を無制限にしたい場合はどうすればよいですか?

空の配列ブラケットを使用する場合は、([])定義にstruct初期化子リストを含める必要があります。例えば:

... } prsn[] = {{"Bill", 1, 23000.00}, {"John", 2, 45000.00}, ...};  

構造体配列のサイズがコンパイル時に不明であり、実行時にのみ利用可能な情報に従ってサイズを設定する必要がある場合は、動的メモリ割り当てまたはVLAを使用できます。まず、動的メモリの場合、配列表記で定義する代わりに、ポインタインスタンスを作成します。

... } *prsn;  

次に、関数でcallocまたはmallocを使用して、たとえば1000インスタンスのメモリを作成します。

int someFunction(void)
{
    prsn = calloc(1000, sizeof(struct Person));
    if(prsn)
    {
        // Use instances of prsn
        // free when finished
        free(prsn);
    }

VLAの場合、作成されるインスタンスにはローカルスコープが必要です。したがって、関数内のどこかで、次のようにします。

int someFunction(int sizeOfStruct)
{
    struct Person newPerson[sizeOfStruct] = {0};

このメソッドは、関連するメモリを解放する必要がないことに注意してください newPerson


Personの数が無制限の場合でも、特に実行時にPersonの数が変化する可能性がある場合は、OPはリンクリスト、またはPersonへのポインターの配列を使用した方がよいでしょう。そうしないと、既存のメンバーを手動でコピーするか、calllを使用して再割り当てするために多くの時間を費やします。
jamesqf

9

上記の2つのコードは同等です。

最初のものでは、あなたが定義しstruct Person、定義しますprsnでは、同時に、その構造体の20要素の配列として。2番目では、最初に構造体を定義し、次に配列を個別に定義します。

Cでは、配列インデックスは0から始まるため、どちらの場合も、prsn配列には0〜19のインデックスが付けられた要素が含まれます。これは、50要素の配列であるメンバーのサイズには影響しませname。20の配列がありstruct Person、それぞれにchar呼び出された50要素の配列が含まれていますname

配列のサイズを無制限にすることに関して、配列はサイズを指定する必要あります。サイズは明示的に[]または初期化子リストを介して暗黙的に指定します。サイズは変数でもかまいませんが、そのような配列はファイルスコープで定義できず、サイズ変数には事前に値が割り当てられている必要があります。


1
つまり、prsn [0]からprsn [19]の配列を意味しますよね?要素を無制限にしたい場合はどうすればよいですか?prsn [n]またはprsn []または単にprsn?
abw1904

2
@ abw1904配列は、必要があります明示的に指定したいずれかの間、大きさを持っている[し、]初期化子リストを介して、または暗黙的に。サイズは変数でもかまいませんが、そのような配列はファイルスコープで定義できず、サイズ変数には事前に値が割り当てられている必要があります。
dbush

1
@ abw1904「可変サイズの配列」をコーディングするには、Linked-Listを見てください。明らかに無制限ではありませんが、実行時に増加する可能性があります
LPs


0

[20]は、のこのインスタンスがstruct Person3つのメンバーの20個の個別のコレクションの配列であることを示しています。配列の各要素には、配列表記を使用してアクセスできます。Cでは、配列インデックスprsnは0から始まるため、毎回0から19で始まります。Cの構造については、このWebサイトをチェックしてください。


外部サイトにリンクするときは、回答の所属を開示する必要があります。そうしないと、スパムとして報告されるリスクがあります。スパマーにならない方法をよく読んでください。さらに言えば、ツアーに参加するのもよいでしょう。
David Buck
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.