Wie werden Strukturmitglieder im Speicher zugewiesen?

Lesezeit: 4 Minuten

Benutzer-Avatar
Douglas Adam Smith II

Beim Versuch, einen Speichermanager für zukünftige C-Programme zu erstellen, bin ich auf diese Frage gestoßen:

“Wenn Strukturen zugewiesen werden, werden ihre Mitgliedsfelder in der angegebenen Reihenfolge gespeichert?”

Betrachten Sie beispielsweise die folgende Struktur.

typedef struct {
    int field1;
    int field2;
    char field3;
} SomeType;

Werden die Speicheradressen der Felder bei der Zuordnung in der Reihenfolge Feld1, Feld2, Feld3 sein? Oder ist das nicht gewährleistet?

  • Sie sollten zuerst mit genau derselben Fragezeichenfolge gesucht haben. Folgendes habe ich gefunden: stackoverflow.com/questions/2748995/c-struct-memory-layout

    – Hariprasad

    23. Dezember 2013 um 4:57 Uhr

Benutzer-Avatar
herohuyongtao

Kurze Antwort: Sie werden mit der Reihenfolge zugewiesen, wie sie in der Struktur angegeben sind.


Beispiel:

#include <stdio.h>
#include <string.h>

struct student 
{
    int id1;
    int id2;
    char a;
    char b;
    float percentage;
};

int main() 
{
    int i;
    struct student record1 = {1, 2, 'A', 'B', 90.5};

    printf("size of structure in bytes : %d\n", 
        sizeof(record1));

    printf("\nAddress of id1        = %u", &record1.id1 );
    printf("\nAddress of id2        = %u", &record1.id2 );
    printf("\nAddress of a          = %u", &record1.a );
    printf("\nAddress of b          = %u", &record1.b );
    printf("\nAddress of percentage = %u",&record1.percentage);

    return 0;
}

Ausgabe:

size of structure in bytes : 16 
Address of id1 = 675376768
Address of id2 = 675376772
Address of a = 675376776
Address of b = 675376777
Address of percentage = 675376780

Die bildliche Darstellung der Speicherzuordnung der obigen Struktur ist unten angegeben. Dieses Diagramm wird Ihnen helfen, das Speicherzuweisungskonzept in C sehr leicht zu verstehen.

Geben Sie hier die Bildbeschreibung ein


Weiterlesen: Kasse hier (auch die Quelle für das obige Beispiel) für C – Structure Padding und Structure dynamic memory allocation in C.

Das ist Ihnen garantiert field3 Kommt danach field2was danach kommt field1und das field1 steht am Anfang des Speichers (d. h. es gibt keine Auffüllung davor field1). Sie können jedoch zwischen den anderen Mitgliedern (und sogar danach) aufgefüllt werden field3). Kurz gesagt, die Reihenfolge, in der sie deklariert werden, ist die Reihenfolge, in der sie im Speicher angeordnet sind, obwohl die genaue Ausrichtung und Auffüllung durch die Implementierung definiert ist (aber es gibt keine Auffüllung vor dem ersten Mitglied).

  • Genau genommen ist das garantiert SomeType x; ((void*) &x) == ((void*) &x.field1).

    – orlp

    23. Dezember 2013 um 4:58 Uhr

  • Warum würde es vor einem Mitglied auffüllen!

    – Rullof

    23. Dezember 2013 um 5:26 Uhr

  • @rullof: Das Auffüllen vor einem Mitglied ist dasselbe wie das Auffüllen nach dem vorherigen Mitglied. Wenn dazwischen Polsterung ist field1 und field2kann man sagen, dass Polsterung hinterher ist field1oder Sie können alternativ sagen, dass vorher Polsterung vorhanden ist field2. Keine Aussage ist falsch; es kommt eben auf die perspektive an. Aber wenn ich Ihre Frage falsch interpretiert habe und Sie sich stattdessen gefragt haben, warum überhaupt eine Polsterung vorhanden sein könnte, lautet die Antwort Alles über das Ausrichten von Dingen im Speicher mit den nativen Ausrichtungsanforderungen des Prozessors.

    – Maisstängel

    23. Dezember 2013 um 5:46 Uhr


  • Ich meine, warum sollte eine Polsterung zwischen den Mitgliedern sein. Was ist der Zweck davon?

    – Rullof

    23. Dezember 2013 um 5:48 Uhr

  • @rullof: Hoppla; Nun, in diesem Fall habe ich den vorherigen Kommentar geändert. Aber um ein bisschen mehr zu erweitern, x86 erfordert das int ist auf 4-Byte-Grenzen ausgerichtet (if int ist 4 Bytes), während char hat keine solche Einschränkung (es handelt sich um eine 1-Byte-Ausrichtung, kann sich also irgendwo im Speicher befinden). Wenn Sie eine haben int nach einer char3 Byte Padding werden benötigt, um sicherzustellen, dass die int auf einer durch 4 teilbaren Speicheradresse aufreiht.

    – Maisstängel

    23. Dezember 2013 um 5:51 Uhr

Benutzer-Avatar
SliceSort

  1. Die Mitglieder werden einzeln lokalisiert;
  2. Der Startort jedes Mitglieds sollte genau durch seine Länge geteilt werden:

Zum Beispiel:

typedef struct {
   char field1;
   int field2;
   double field3;
} SomeType;

Die erste Position der Struktur ist x:

Die Länge von Feld1 ist 1 (Byte), Feld2 ist 4, Feld3 ist 8

Feld1 ist also bei x+0, Feld2 ist bei x+4~x+7, Feld3 ist bei x+8~x+15 und x+1~x+3 ist aufgefüllt, um Feld2 an der richtigen Stelle zu machen.

Und die gesamte Länge der Struktur sollte genau durch ihr größtes Mitglied geteilt werden; Wenn nicht, füllen Sie einige Bytes bis zum Ende auf.

  • Nein, die Länge des größten Mitglieds spielt keine Rolle. Vielleicht denkst du an ein C Union?

    – Phil Perry

    13. Januar 2014 um 16:07 Uhr

1283480cookie-checkWie werden Strukturmitglieder im Speicher zugewiesen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy