Was macht [20]? Was bedeutet das?
Die folgenden Kommentare zeigen die allgemeine Nomenklatur für die Teile Ihrer Struktur :
struct Person { //struct name (Person)
char name[50]; // \
int citNo; // --struct members
float salary; // /
} prsn[20]; // instance of struct Person array
Das [20]
zeigt an, dass diese Instanz struct Person
ein Array von 20 separaten Sammlungen der 3 Mitglieder ist. Auf jedes Element des Arrays kann mit der Array-Notation zugegriffen werden. Zum Beispiel in einer Schleife:
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;
}
Beschränkt die [20] den Namen auf 20 (von 50) oder die prsn
von prsn[1]
auf prsn[20]
?
Das Mitglied name[50]
definiert ein Array mit 50 Zeichen. Seine Größe wird in keiner Weise durch den [20]
Index beeinflusst, der zur Größe des Arrays von struct verwendet wird. dh , wie Sie es definiert haben, gibt es 20 Fälle von prsn
, jede Instanz , die 3 Mitglieder: char [50]
, int
und float
. Und Ihrer Definition nach ermöglichen die 20 von der erstellten Instanzen den [20]
Zugriff auf das Array mit Indexwerten von 0
bis 19
. (Siehe Schleifenabbildung oben.)
BEARBEITEN , um die OP-Frage in den Kommentaren zu beantworten:
Und was muss ich tun, wenn ich die Elemente unbegrenzt machen will?
Wenn Sie die leeren Array-Klammern verwenden möchten, ( []
) muss die Definition eine Strukturinitialisierungsliste enthalten . Zum Beispiel:
... } prsn[] = {{"Bill", 1, 23000.00}, {"John", 2, 45000.00}, ...};
Wenn die Größe des Strukturarrays zur Kompilierungszeit nicht bekannt ist und gemäß den nur zur Laufzeit verfügbaren Informationen dimensioniert werden muss, kann entweder eine dynamische Speicherzuweisung oder eine VLA verwendet werden. Erstellen Sie für den dynamischen Speicher zunächst eine Zeigerinstanz, anstatt sie mit der Array-Notation zu definieren:
... } *prsn;
Verwenden Sie dann in einer Funktion calloc
oder malloc
, um Speicher für beispielsweise 1000 Instanzen zu erstellen:
int someFunction(void)
{
prsn = calloc(1000, sizeof(struct Person));
if(prsn)
{
// Use instances of prsn
// free when finished
free(prsn);
}
Für VLA müssen die erstellten Instanzen einen lokalen Bereich haben. Führen Sie also innerhalb einer Funktion irgendwo Folgendes aus:
int someFunction(int sizeOfStruct)
{
struct Person newPerson[sizeOfStruct] = {0};
Beachten Sie, dass für diese Methode kein Speicher freigegeben werden muss newPerson
20
Elementen vom Typstruct Person