Array-Elemente von struct und struct-Mitgliedern

8

Ich möchte nach einer Strukturdeklaration in C fragen. Zum Beispiel:

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

Was macht [20]das Was bedeutet das? Beschränkt es den Namen auf 20 (von 50) oder den prsnvon prsn[1]auf prsn[20]?

Und wenn ich den Code so schreibe:

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

Tut es das Gleiche?

abw1904
quelle
3
Sie sind die gleichen: Beide deklarieren ein Array von 20Elementen vom Typstruct Person
LPs
Es ist wie mit int prsn[20];Ausnahme von struct Person anstelle von int
MM

Antworten:

8

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 Personein 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 prsnvon 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], intund float. Und Ihrer Definition nach ermöglichen die 20 von der erstellten Instanzen den [20]Zugriff auf das Array mit Indexwerten von 0bis 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 callocoder 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

Ryyker
quelle
Für eine unbegrenzte Anzahl von Personen ist es möglicherweise besser, eine verknüpfte Liste oder ein Array von Zeigern auf Person zu verwenden, insbesondere wenn sich die Anzahl der Personen zur Laufzeit ändert. Andernfalls verbringen Sie viel Zeit damit, die vorhandenen Mitglieder entweder manuell oder per Calll zu Realloc zu kopieren.
Jamesqf
9

Die beiden obigen Codeteile sind äquivalent.

Im ersten definieren struct Personund definieren Sie prsnals Array von 20 Elementen dieser Struktur gleichzeitig. Im zweiten Fall definieren Sie zuerst die Struktur und dann das Array separat.

In C beginnen Array-Indizes bei 0, sodass das prsnArray in beiden Fällen Elemente enthält, die von 0 bis 19 indiziert sind. Dies hat keinen Einfluss auf die Größe des nameElements, bei dem es sich um ein Array mit 50 Elementen handelt. Sie haben eine Reihe von 20 struct Person, von denen jede enthält eine 50 - Element - Array von chargenannt name.

Um die Arraygröße unbegrenzt zu machen, muss ein Array eine Größe haben, die entweder explizit zwischen [und ]oder implizit über eine Initialisierungsliste angegeben wird. Die Größe kann eine Variable sein, ein solches Array kann jedoch nicht im Dateibereich definiert werden, und der Größenvariablen muss zuvor ein Wert zugewiesen worden sein.

dbush
quelle
1
Das bedeutet also ein Array von prsn [0] bis prsn [19], oder? Und was muss ich tun, wenn ich die Elemente unbegrenzt machen will? prsn [n] oder prsn [] oder nur prsn?
abw1904
2
@ abw1904 Ein Array muss eine Größe haben, die entweder explizit zwischen [und ]implizit über eine Initialisierungsliste angegeben wird. Die Größe kann eine Variable sein, ein solches Array kann jedoch nicht im Dateibereich definiert werden, und der Größenvariablen muss zuvor ein Wert zugewiesen worden sein.
dbush
1
@ abw1904 Um ein "Array mit variabler Größe" zu codieren, sollten Sie sich Linked-List ansehen. Natürlich wird es nicht unbegrenzt sein, aber es kann zur Laufzeit wachsen
LPs
1

Sie deklarieren ein Array mit 20 Strukturen dieses Typs

Mathe-Liebhaber
quelle