Speicher für eine Struktur in C zuweisen

Lesezeit: 3 Minuten

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 ));

Benutzeravatar von Martin Beckett
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); 

Benutzeravatar von alemjerus
alemjerus

struct st *x = (struct st *)malloc(sizeof(struct st));

Benutzeravatar von Ritwik Bose
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


1390240cookie-checkSpeicher für eine Struktur in C zuweisen

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

Privacy policy