[20]は何をしますか?どういう意味ですか?
以下のコメントは、構造体の部分の一般的な命名法を示しています。
struct Person { //struct name (Person)
char name[50]; // \
int citNo; // --struct members
float salary; // /
} prsn[20]; // instance of struct Person array
[20]
このインスタンスがことを示しているstruct Person
3員の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から)制限しますか、それともprsn
from prsn[1]
をに制限しprsn[20]
ますか?
メンバーname[50]
は50文字の配列を定義します。そのサイズは[20]
、構造体の配列のサイズを設定するために使用されるインデックスの影響を受けません。つまり、あなたはそれが定義されているとして、そこの20のインスタンスであるprsn
、3つのメンバーを含む各インスタンスは: char [50]
、int
とfloat
。そして、あなたの定義によって、によって作成された20件の事例では[20]
、配列からインデックス値でアクセスすることができ0
て19
。(上記のループ図を参照してください。)
コメントで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
20
タイプの要素の配列を宣言しますstruct Person