Mitgliedszeiger und flexible Arrays und ihre Vor- und Nachteile

Ein Zeiger auf ein Mitglied einer Struktur:

        Wenn die Anzahl der Mitglieder eines bestimmten Elements der Struktur nicht festgelegt ist, können wir die Anzahl der Mitglieder + den Zeiger + den Heapspeicher verwenden, um die Mitglieder entsprechend der tatsächlichen Situation zu speichern. Beispielsweise beträgt die Anzahl der Klassen von Schülern in verschiedenen Klassen unsicher.

Anwendungsbeispiel:

typedef struct Student
    {
        int id;
        char name[20];

        int score_cnt;
        float* score;
    }Student;

    // 定义成员,使用栈内存
    Student stu = {1001,"hehe",2};
    stu.score = malloc(sizeof(*stu.score)*stu.score_cnt);
    free(stu.score);

    // 定义成员,使用堆内存
    Student* stup = malloc(sizeof(Student));
    stup->score = malloc(sizeof(*stup->score)*stup->score_cnt);

Speicherfreigabe:

 free(stup->score);
    free(stup);

Hinweis: Unabhängig davon, ob die Strukturvariable definiert ist, muss der Heapspeicher dem Mitgliedszeiger separat zugewiesen werden. Andernfalls ist der Mitgliedszeiger ein Wildzeiger und muss nach Verwendung der Strukturvariablen separat freigegeben werden, da sonst ein Speicherverlust auftritt.

Flexibles Array:

    Wenn die Anzahl der Mitglieder eines bestimmten Elements der Struktur nicht festgelegt ist, können Sie am Ende der Struktur ein Array mit einer Länge von Null definieren. Diese Art von Array wird als flexibles Array bezeichnet. Wenn Sie der Struktur mehr Speicher zuweisen Variable, desto mehr zugewiesener Speicher wird als flexibel bezeichnet. Array-Nutzung.

 typedef struct Student
    {
        int id;
        char name[20];
        int score_cnt;
        float score[]; // 柔性数组
    }Student;

    Student* stup = malloc(sizeof(Student)+sizeof(stup->score[0])*len);
    stup->score = len;

    for(int i=0; i<stup->score_cnt; i++)
    {
        scanf("%f",&stup->score[i]);
    }

    free(stup)

Vor- und Nachteile von Mitgliedszeigern und flexiblen Arrays:

 Nachteile der Verwendung von Mitgliedszeigern:

        1. Die Verwendung ist mühsam und muss zweimal zugewiesen und zweimal freigegeben werden.

        2. Hohes Risiko, anfällig für wilde Zeiger und Speicherverluste.

        3. Der Speicher, auf den Strukturvariablen und Mitgliedszeiger zeigen, sind zwei unabhängige Speicherblöcke, die anfällig für Speicherfragmentierung sind.

        4. Der Mitgliedszeiger belegt 4|8 Byte Platz in der Struktur, und unter Berücksichtigung der Ausrichtung und Auffüllung wird mehr Speicher verschwendet.

    Vorteile flexibler Arrays:

        1. Es ist einfach zu verwenden und erfordert keine separate Zuweisung von Speicher für flexible Arrays, sondern lediglich die Zuweisung von mehr Speicher für Strukturvariablen.

        2. Hohe Sicherheit, das flexible Array ist nur ein Fehlerzeichen in der Struktur, daher werden keine wilden Zeiger verwendet.

        3. Der vom flexiblen Array verwendete Speicherblock ist in die Strukturvariable integriert und wird zusammen mit dem Speicher der Strukturvariablen zugewiesen und freigegeben, sodass es nicht leicht zu Speicherlecks und Speicherfragmenten kommt.

        4. Um Speicher zu sparen, ist das flexible Array nur eine Markierung in der Struktur und belegt keinen zusätzlichen Speicher der Struktur. Bei der Berechnung der Gesamtzahl der Bytes der Struktur wird das flexible Array nicht in die Berechnung einbezogen.

    Nachteile flexibler Arrays:

        Diese Syntax wurde im C99-Syntaxstandard vorgeschlagen und implementiert. Die frühen Compiler, die nur C89 unterstützten, unterstützten diese Verwendung nicht und ihre Vielseitigkeit war nicht besonders groß.

Supongo que te gusta

Origin blog.csdn.net/m0_62480610/article/details/125927536
Recomendado
Clasificación