Ich habe die Aufgabe, ein Programm zu erstellen, das dynamisch Speicher für eine Struktur zuweist. normalerweise würden wir verwenden
x=malloc(sizeof(int)*y);
Was verwende ich jedoch für eine Strukturvariable? Ich glaube nicht, dass es möglich ist
struct st x = malloc(sizeof(struct));
Könnte mir jemand weiterhelfen? Vielen Dank!
@Blackbinary: Fast geschafft. Die korrekte Syntax ist malloc(sizeof(struct st)). Na sicher sizeof *x unten angegeben ist bevorzugt.
– kennytm
1. Februar 2010 um 14:42 Uhr
Mein Favorit:
#include <stdlib.h>
struct st *x = malloc(sizeof *x);
Beachten Sie, dass:
x muss ein Zeiger sein
Es ist keine Besetzung erforderlich
passenden Header einfügen
Lassen Sie Kinder nicht mit scharfen Gegenständen spielen 🙂
– Nikolai Fetissov
1. Februar 2010 um 14:42 Uhr
Was mir am besten gefällt, ist die Tatsache, dass die RHS auch dann noch funktioniert, wenn Sie die Struktur später umbenennen. Mit modernen Editoren ist dies wohl kein großes Problem.
– dirkgent
1. Februar 2010 um 14:45 Uhr
Genial. Kein malloc( sizeof( struct foo ) ) mehr für mich … 🙂 (auch toller Benutzername)
– dicroce
1. Februar 2010 um 15:02 Uhr
Wird RHS Sie nicht in Schwierigkeiten bringen, wenn Sie einen Tippfehler machen und * verpassen? Ich dachte immer, anstatt *x zu tun, den Strukturnamen zu erwähnen, ist ein besserer Weg, da er vor Tippfehlern schützt. Übersehe ich hier etwas?
– Jay
1. Februar 2010 um 15:04 Uhr
@Jay: Sicherlich, aber das ist nur eine der vielen subtilen Möglichkeiten, wie Sie Fehler einschleusen können. Ich habe gelesen (und gelitten), dass ich vergessen habe, das zu ändern struct Name auf der rechten Seite viel mehr. Ein weiterer Kontrapunkt: Lesen Sie meinen ersten Punkt mit Aufzählungszeichen oder David Thornleys Kommentar.
– dirkgent
1. Februar 2010 um 15:52 Uhr
Das machst du nicht ganz richtig. struct st x ist eine Struktur, kein Zeiger. Es ist in Ordnung, wenn Sie eine auf dem Stapel zuweisen möchten. Für die Zuweisung auf dem Heap struct st * x = malloc(sizeof(struct st));.
struct st* x = malloc( sizeof( struct st ));
Martin Beckett
Genau das ist möglich – und der richtige Weg
Angenommen, Sie wollten tippen
struct st *x = malloc(sizeof(struct st));
p.s. Sie müssen sizeof(struct) ausführen, selbst wenn Sie die Größe des gesamten Inhalts kennen, da der Compiler die Struktur möglicherweise ausfüllt, sodass die Elemente ausgerichtet sind.
struct tm {
int x;
char y;
}
könnte eine andere Größe haben
struct tm {
char y;
int x;
}
Dies sollte tun:
struct st *x = malloc(sizeof *x);
alemjerus
struct st *x = (struct st *)malloc(sizeof(struct st));
Ritwik Bose
Ich glaube, wenn Sie anrufen sizeof auf einen struct type, C ruft sizeof rekursiv für die Felder von auf struct. So, struct st *x = malloc(sizeof(struct st)); funktioniert nur wirklich wenn struct st hat eine feste Größe. Dies ist nur von Bedeutung, wenn Sie so etwas wie eine Zeichenfolge mit variabler Größe in Ihrer Struktur haben und ihr nicht jedes Mal die maximale Länge geben möchten.
Im Algemeinen,
struct st *x = malloc(sizeof(struct st));
funktioniert. Gelegentlich stoßen Sie entweder auf Strukturen mit variabler Größe oder auf „abstrakte“ Strukturen (denken Sie an die abstrakte Klasse von Java), und der Compiler teilt Ihnen mit, dass er die Größe der Struktur st nicht bestimmen kann. In diesen Fällen müssen Sie entweder die Größe von Hand berechnen und malloc mit einer Zahl aufrufen, oder Sie finden eine Funktion, die eine vollständig implementierte und mallocierte Version der gewünschten Struktur zurückgibt.
AFAIK in C gibt es keine Strukturen mit variabler Größe oder abstrakte Strukturen (Sie können sie fälschen, aber sie werden auf Sprachebene nicht unterstützt); Der einzige Fall, in dem der Compiler Ihnen mitteilt, dass er die Größe einer Struktur nicht kennt, ist, wenn die Struktur nur deklariert, aber nicht definiert ist (nützlich, wenn Sie in der aktuellen Kompilierungseinheit nur Zeiger auf die Struktur behandeln).
– Matteo Italien
2. Februar 2010 um 12:52 Uhr
13902400cookie-checkSpeicher für eine Struktur in C zuweisenyes
@Blackbinary: Fast geschafft. Die korrekte Syntax ist
malloc(sizeof(struct st))
. Na sichersizeof *x
unten angegeben ist bevorzugt.– kennytm
1. Februar 2010 um 14:42 Uhr