C: Zeiger auf Struct in der Struct-Definition

Lesezeit: 5 Minuten

Benutzeravatar von claf
Claf

Wie kann ich einen Zeiger auf die nächste Struktur in der Definition dieser Struktur haben:

typedef struct A {
  int a;
  int b;
  A*  next;
} A;

So habe ich es zuerst geschrieben, aber es funktioniert nicht.

  • Hinweis C11 §6.7.2.1 Struktur- und Vereinigungsspezifizierer ¶3: Eine Struktur oder Vereinigung darf kein Element mit unvollständigem oder Funktionstyp enthalten (daher darf eine Struktur keine Instanz von sich selbst enthalten, kann aber einen Zeiger auf eine Instanz von sich selbst enthalten), …

    – Jonathan Leffler

    14. November 2019 um 6:34 Uhr

Benutzeravatar von CB Bailey
CB Bailey

Sie können die Typedef definieren und die Struktur zuerst in einer Anweisung deklarieren und dann die Struktur in einer nachfolgenden Definition definieren.

typedef struct A A;

struct A
{
    int a;
    int b;
    A* next;
};

Bearbeiten: Wie andere bereits erwähnt haben, ist der Strukturname ohne die Vorwärtsdeklaration immer noch innerhalb der Strukturdefinition gültig (dh Sie können verwendet werden struct A), aber die Typedef ist erst verfügbar, nachdem die Typedef-Definition abgeschlossen ist (also die Verwendung von just A wäre nicht gültig). Bei nur einem Zeigermitglied mag dies keine allzu große Rolle spielen, aber wenn Sie eine komplexe Datenstruktur mit vielen selbstartigen Zeigern haben, ist dies möglicherweise weniger praktisch.

  • Dies ist der “kanonische” Weg, dies zu tun.

    – abschalten

    3. Februar 2009 um 8:50 Uhr

  • Entspannung: Viele Codierungsstilkonventionen für C widersetzen sich vehement der Typdefinition von Strukturen. Ich würde nicht sagen, dass es überhaupt kanonisch ist.

    – Chris Jung

    3. Februar 2009 um 10:40 Uhr

  • Wenn ich für Kommentare stimmen könnte, würde Chris Young +1 bekommen. Es gibt einen großen Unterschied zwischen nativen Typen und Aggregatstrukturen. Nicht versteckt es hinter einem typedef.

    – vergänglich

    3. Februar 2009 um 21:37 Uhr

  • @ephemient Warum sollte ich es nicht verstecken? Sie sind nur Implementierungsdetails.

    – YoTengoUnLCD

    26. Februar 2017 um 6:02 Uhr

  • @turner: weil eins A identifiziert den Strukturtyp in struct Aund die zweite gibt dem Typ einen Namen (Alias) von A. Wenn du hättest typedef int B;dann int ist der Typ und B ist der neue Name für den Typ. Ebenso mit typedef struct A A;dann struct A ist der Typ und A ist der neue Name für den Typ.

    – Jonathan Leffler

    14. November 2019 um 6:37 Uhr

Zusätzlich zur ersten Antwort ohne Typedef- und Forward-Deklaration sollte dies auch in Ordnung sein.

struct A 
{ 
    int a; 
    int b; 
    struct A *next; 
};

  • Außerdem wissen Sie ohne Typedefs tatsächlich, ob Sie es mit einer Struktur im Code zu tun haben

    – Gregor Schmitt

    27. August 2018 um 15:47 Uhr

Ihnen fehlt die struct Vor dem A*

  typedef struct A {
    int a;
    int b;
    struct A* next;
  } A;

Sie können auf die Vorwärtsdeklaration verzichten:

struct A {
    int a;
    int b;
    struct A *next;
};

Bitte, Sie sind in C, nicht in C++.

Wenn Sie wirklich eine Struktur eingeben müssen (und die meisten Programmierer, mit denen ich arbeite, würden dies nicht tun¹), tun Sie dies:

typedef struct _A {
    int a;
    int b;
    struct _A *next;
} A;

klar zu unterscheiden _A (in dem struct Namensraum) und A (im Typnamensraum).

¹typedef verbirgt die Größe und den Speicher des Typs, auf den es zeigt – das Argument (und dem stimme ich zu) ist, dass in einer Low-Level-Sprache wie C der Versuch, irgendetwas zu verbergen, schädlich und kontraproduktiv ist. Gewöhnen Sie sich an das Tippen struct A wann immer du meinst struct A.

  • Wie sagt mir “struct A” etwas über seine Größe?

    – quant_dev

    3. Februar 2009 um 23:25 Uhr

  • Es sagt Ihnen, dass es sich um eine aggregierte Struktur handelt, und daher viele Dinge wie das Übergeben als Argumente, das Zurückgeben, Vergleiche und a = b sind ineffizient oder funktionieren nicht.

    – vergänglich

    4. Februar 2009 um 1:08 Uhr

  • A ist ein reservierter Name. EIN wäre in Ordnung.

    – MSalter

    12. Februar 2009 um 10:31 Uhr

  • Nitpick: _A ist ein schlechter Name: Führende Unterstriche gehören dem Compiler. Bearbeiten Verdammt, ich glaube, ich habe gerade MSalters wiederholt.

    – Bernd Jendrissek

    18. Juni 2010 um 14:07 Uhr


  • Ich bin in meiner ganzen Programmierzeit nie auf ein Problem gestoßen, wenn ich der Struktur und der Typedef denselben Namen gegeben habe, und dann mache ich mir nur die Mühe, der Struktur in genau diesem Fall einen Namen zu geben (verknüpfte Listen usw.). Ich denke, Sie werben nur für FUD. Können Sie ein Beispiel geben, wo es Probleme bereitet, beiden denselben Namen zu geben? Außerdem bin ich bei der Verwendung von typedef für alle meine Strukturen noch nie auf ein Problem gestoßen, daher finde ich Ihr Argument, dass es “schädlich und kontraproduktiv” ist, etwas übertrieben zu sein.

    – Wayne Uroda

    21. Juni 2018 um 2:53 Uhr

Benutzeravatar von user7296055
Benutzer7296055

typedef struct {
 values
} NAME;

Dies ist ein kürzerer Weg, um eine Struktur zu definieren. Ich denke, es ist die einfachste Notation. Stellen Sie den Namen einfach nicht voran, sondern dahinter.

du kannst es dann gerne nennen

NAME n;  

NAME *n; // if you'd like a ptr to it.

Ist an diesem Ansatz etwas falsch?

  • Wie sagt mir “struct A” etwas über seine Größe?

    – quant_dev

    3. Februar 2009 um 23:25 Uhr

  • Es sagt Ihnen, dass es sich um eine aggregierte Struktur handelt, und daher viele Dinge wie das Übergeben als Argumente, das Zurückgeben, Vergleiche und a = b sind ineffizient oder funktionieren nicht.

    – vergänglich

    4. Februar 2009 um 1:08 Uhr

  • A ist ein reservierter Name. EIN wäre in Ordnung.

    – MSalter

    12. Februar 2009 um 10:31 Uhr

  • Nitpick: _A ist ein schlechter Name: Führende Unterstriche gehören dem Compiler. Bearbeiten Verdammt, ich glaube, ich habe gerade MSalters wiederholt.

    – Bernd Jendrissek

    18. Juni 2010 um 14:07 Uhr


  • Ich bin in meiner ganzen Programmierzeit nie auf ein Problem gestoßen, wenn ich der Struktur und der Typedef denselben Namen gegeben habe, und dann mache ich mir nur die Mühe, der Struktur in genau diesem Fall einen Namen zu geben (verknüpfte Listen usw.). Ich denke, Sie werben nur für FUD. Können Sie ein Beispiel geben, wo es Probleme bereitet, beiden denselben Namen zu geben? Außerdem bin ich bei der Verwendung von typedef für alle meine Strukturen noch nie auf ein Problem gestoßen, daher finde ich Ihr Argument, dass es “schädlich und kontraproduktiv” ist, etwas übertrieben zu sein.

    – Wayne Uroda

    21. Juni 2018 um 2:53 Uhr

1413130cookie-checkC: Zeiger auf Struct in der Struct-Definition

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

Privacy policy