So erstellen Sie eine neue Instanz einer Struktur

Lesezeit: 3 Minuten

Benutzer-Avatar
Robin Huang

Was ist der richtige Weg, um eine neue Instanz einer Struktur zu erstellen? Angesichts der Struktur:

struct listitem {
    int val;
    char * def;
    struct listitem * next;
};

Ich habe zwei Möglichkeiten gesehen..

Der erste Weg (xCode sagt, dass dies die Struktur neu definiert und falsch ist):

struct listitem* newItem = malloc(sizeof(struct listitem));

Der zweite Weg:

listitem* newItem = malloc(sizeof(listitem));

Alternativ gibt es eine andere Möglichkeit?

  • “(xCode sagt, dass dies die Struktur neu definiert und falsch ist)”. Es gibt etwas, das Sie uns nicht sagen, da der erste Weg weder darin besteht, die Struktur neu zu definieren, noch falsch ist.

    – Benutzer3386109

    15. September 2015 um 4:46 Uhr

  • @ user3386109 oh du hast recht! XCode sagte nur, dass es falsch ist, weil ich es in einer Funktion verwendet habe, nicht in main(). Bin mir aber nicht sicher warum…

    – Robin Huang

    15. September 2015 um 6:15 Uhr

Benutzer-Avatar
Prog_ist_leben

Es hängt davon ab, ob Sie einen Zeiger wollen oder nicht.

Es ist besser, Ihre Struktur so zu nennen:

typedef struct s_data 
{
    int a;
    char *b;
    // etc..
} t_data;

Nach dem Instanziieren für eine No-Pointer-Struktur:

t_data my_struct;
my_struct.a = 8;

Und wenn Sie einen Zeiger wollen, müssen Sie ihn so mallocieren:

t_data *my_struct;
my_struct = malloc(sizeof(t_data));
my_struct->a = 8

Ich hoffe, das beantwortet Ihre Frage.

Der zweite Weg funktioniert nur, wenn Sie verwendet haben

typedef struct listitem listitem;

vor jeder Deklaration einer Variablen mit Typ listitem. Sie können die Struktur auch einfach statisch zuweisen, anstatt sie dynamisch zuzuweisen:

struct listitem newItem;

Die Art und Weise, die Sie demonstriert haben, ist wie das Folgende für alle int Sie erstellen möchten:

int *myInt = malloc(sizeof(int));

  • Die einfache Konvention zu immer: typedef Foo_tag { ... } Foo_t und mit der Foo_t sofort funktioniert ziemlich gut in der C-Programmierung. Da fallen eigentlich nur die Tippkosten an typedef aber danach amortisiert es sich, indem es nie mehr tippen muss struct Foo_tag überhaupt.

    – BitTickler

    15. September 2015 um 4:45 Uhr


  • struct listitem newItem; ist nur eine statische Zuordnung, wenn sie im Dateibereich auftritt. Im Blockbereich ist dies die automatische Zuweisung.

    – MM

    15. September 2015 um 4:53 Uhr

  • @MM Du hast natürlich Recht, aber im Allgemeinen malloc und Freunde befassen sich mit der dynamischen Zuordnung, während andere Formen der Zuordnung unabhängig von der Platzierung innerhalb einer Datei häufig als “statische Zuordnung” bezeichnet werden, um sie von der dynamischen Zuordnung zu unterscheiden.

    Benutzer539810

    15. September 2015 um 5:11 Uhr

  • @BitTickler Mir persönlich ist es egal. Das werde ich beachten typedef struct List_tag List; struct List_tag { List *next, *prev; int data }; funktioniert sogar noch besser für Strukturen, die Zeiger auf Elemente des zu definierenden Strukturtyps benötigen.

    Benutzer539810

    15. September 2015 um 5:15 Uhr

  • Bitte beachten Sie, dass Namen mit der Endung _t sind der Implementierung vorbehalten und sollten vermieden werden. Siehe stackoverflow.com/a/12727104/1701799.

    – RastaJedi

    23. August 2016 um 18:43 Uhr


struct listitem newItem; // Automatic allocation
newItem.val = 5;

Hier ist ein kurzer Überblick über Strukturen:
http://www.cs.usfca.edu/~wolber/SoftwareDev/C/CStructs.htm

Neben den anderen Antworten möchte ich zwei weitere kompakte Möglichkeiten zum Erstellen von Instanzen hinzufügen. Beispiel:

struct Person{
    float position[2];
    int age;
    char name[20];
}
struct Person p1 = { {4, 1.1}, 20, "John" };
struct Person p2 = { .age=60, .name="Jane", .position={0, 0} };
printf("%s, aged %i, is located at (%f, %f)\n", p1.name, p1.age,p1.position[0], p1.position[1] );
printf("%s, aged %i, is located at (%f, %f)\n", p2.name, p2.age,p2.position[0], p2.position[1] );

Ausgang:

John, aged 20, is located at (4.000000, 1.100000)
Jane, aged 60, is located at (0.000000, 0.000000)

Beachten Sie das für p1 die Reihenfolge der Eigenschaften stimmt mit der der Strukturdefinition überein. Wenn Sie nicht ständig struct eingeben möchten, wenn Sie einen Typ verwenden, können Sie mit einen neuen Alias ​​definieren

typedef struct Person SomeNewAlias;
SomeNewAlias p1;

und Sie können den neuen Alias ​​genauso nennen wie den alten Namen

typedef struct Person Person;
Person p1;

1360160cookie-checkSo erstellen Sie eine neue Instanz einer Struktur

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

Privacy policy