“(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
Prog_ist_leben
Es hängt davon ab, ob Sie einen Zeiger wollen oder nicht.
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.
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;
13601600cookie-checkSo erstellen Sie eine neue Instanz einer Strukturyes
“(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