Warum eine Struktur deklarieren, die nur ein Array in C enthält?

Lesezeit: 7 Minuten

Benutzeravatar von Joe.Z
Joe.Z

Ich bin auf einen Code gestoßen, der Folgendes enthält:

struct ABC {
    unsigned long array[MAX];
} abc;

Wann ist eine solche Deklaration sinnvoll?

Es ermöglicht Ihnen, das Array als Wert an eine Funktion zu übergeben oder es als Wert von einer Funktion zurückzugeben.

Strukturen können als Wert übergeben werden, im Gegensatz zu Arrays, die in diesen Kontexten zu einem Zeiger zerfallen.

  • Hüten Sie sich davor, dies mit Arrays zu tun, die mehr als sagen wir 16 oder 32 Byte groß sind, für Funktionen, die nicht inline sind: Es ist effizienter, sie per const-Referenz zu übergeben, es sei denn, der Aufgerufene benötigt bereits eine tmp-Kopie, die er zerstören kann. Wenn der Aufruf / die Rückgabe nicht wegoptimiert wird, ist ein mittleres bis großes Array (Tausende von Bytes) eine schreckliche Sache, um den Wert zu übergeben.

    – Peter Cordes

    11. Juni 2018 um 16:49 Uhr

Ein weiterer Vorteil ist, dass es die Größe abstrahiert, sodass Sie es nicht verwenden müssen [MAX] überall in Ihrem Code, wo immer Sie ein solches Objekt deklarieren. Dies könnte auch mit erreicht werden

typedef char ABC[MAX];

aber dann hast du ein viel größeres problem: das muss dir bewusst sein ABC ein Array-Typ ist (obwohl Sie dies nicht sehen können, wenn Sie Variablen vom Typ deklarieren ABC) oder Sie werden von der Tatsache gestochen, dass ABC bedeutet in einer Funktionsargumentliste etwas anderes als in einer Variablendeklaration/-definition.

Ein weiterer Vorteil besteht darin, dass Sie mit der Struktur bei Bedarf später weitere Elemente hinzufügen können, ohne viel Code neu schreiben zu müssen.

Sie können eine Struktur kopieren und eine Struktur von einer Funktion zurückgeben.

Mit einem Array ist das nicht möglich – es sei denn, es ist Teil einer Struktur!

Du kannst es so kopieren.

struct ABC a, b;
........
a = b;

Für ein Array müssten Sie verwenden memcpy Funktion oder eine Schleife, um jedes Element zuzuweisen.

Sie können struct verwenden, um einen neuen Datentyp wie z Schnur. du kannst definieren:

struct String {
    char Char[MAX];
};

oder Sie können eine erstellen Aufführen von Daten, die Sie als Argument von Funktionen verwenden oder in Ihren Methoden zurückgeben können. Die Struktur ist flexibler als ein Array, da sie einige Operatoren wie = unterstützen kann und Sie einige Methoden darin definieren können.

Hoffe es ist nützlich für dich 🙂

  • Im Grunde ist es das, was C dem Erstellen einer Klasse am nächsten kommt. Ich mag diese Antwort, weil sie dem am nächsten kommt, darauf hinzuweisen.

    – Nate CK

    7. August 2011 um 2:12 Uhr

  • So etwas wie eine Methode gibt es in C nicht. Strukturen in C sind einfache alte Daten. Es hat einen =-Operator, der standardmäßig unterstützt wird (was die anderen Antworten zeigen, ist der Grund dafür), aber das ist irreführend und gilt hauptsächlich für C++, nicht für C.

    – Jonathan Sternberg

    7. August 2011 um 5:48 Uhr

  • @J Sternberg: “Methode” ist nur eine Art, über Unterroutinen nachzudenken, die sich auf die Daten-“Objekte” beziehen, auf die sie sich auswirken. Sie können sicherlich “Klassen” von “Objekten” und “Methoden” erstellen, die in C auf ihnen operieren. Die Sprache definiert solche Dinge nur nicht formal. Wenn Sie bessere Abstraktionen in C erstellen möchten, ist es normalerweise am besten, Dinge in eine Struktur zu stopfen.

    – Nate CK

    9. August 2011 um 18:16 Uhr

  • Wenn Sie wirklich Methoden in C “erstellen” wollten, könnten Sie außerdem Funktionszeiger (ja, ja, knifflige Syntax, kein Datenschutz usw.) verwenden, um Funktionen mit den Daten zu verknüpfen, mit denen sie arbeiten. Sie müssen “self” im ersten Argument übergeben (Sie könnten es sogar “this” nennen, wenn Sie wollten), da es keine automatische Erstellung dieses Zeigers innerhalb der Funktion in C gibt. Natürlich ist es alles Gymnastik, verstehen Sie Dinge wie diese standardmäßig in C ++, obwohl es stimmt, dass als Bonus ein versteckter Overhead vorhanden sein könnte …

    – BenPen

    12. Dezember 2018 um 16:23 Uhr

  • @NateC-K eine Struktur ist nur eine Struktur und es besteht keine Notwendigkeit, eine Funktion aufzurufen, die auf einer Struktur-‘Methode’ arbeitet. In diesem Zusammenhang ist „Klasse“ etwas irreführend. Denn eigentlich geht es beim Packen des Arrays in eine Struktur darum, es kopierbar zu machen. Im Gegensatz dazu nehmen Methoden ihre ‘this’-Klasse als Referenz. Auch der ganze Klassen-/Methoden-Jargon macht mehr Sinn in Verbindung mit Typ-Klassen-Polymorphismus, der in c nicht wirklich existiert

    – johannes_lalala

    10. April um 22:10 Uhr


Ein weiterer Vorteil der Verwendung eines solchen struct ist es das erzwingt Typsicherheit wo immer so ein struct wird genutzt; Besonders wenn Sie zwei Typen haben, die aus Arrays derselben Größe bestehen, die für unterschiedliche Zwecke verwendet werden, helfen Ihnen diese Typen dabei, die versehentliche Verwendung eines Arrays unangemessen zu vermeiden.

Wenn Sie ein Array nicht in a structkönnen Sie immer noch a deklarieren typedef Dafür: das hat einige Vorteile der struct – • der Typ wird einmal deklariert, • die Größe ist automatisch korrekt, • die Absicht des Codes wird klarer, • und der Code ist wartbarer – aber Sie verlieren ◦ strikte Typsicherheit, ◦ die Möglichkeit, Werte des Typs zu kopieren und zurückzugeben und ◦ die Möglichkeit, später Mitglieder hinzuzufügen, ohne den Rest Ihres Codes zu beschädigen. Zwei typedefs für leere Arrays eines bestimmten Typs ergeben nur unterschiedliche Typen, wenn sie unterschiedliche Größen haben. Darüber hinaus, wenn Sie die verwenden typedef ohne * in einem Funktionsargument ist es äquivalent zu char *wodurch die Typsicherheit drastisch reduziert wird.

Zusammenfassend:

typedef struct A_s_s { char m[113]; } A_s_t; // Full type safey, assignable
typedef char   A_c_t[113];                   // Partial type-safety, not assignable

A_s_t          v_s(void);     // Allowed
A_c_t          v_c(void);     // Forbidden

void           s__v(A_s_t);     // Type-safe, pass by value
void           sP_v(A_s_t *);   // Type-safe
void           c__v(A_c_t);     // UNSAFE, just means char * (GRRR!)
void           cP_v(A_c_t *);   // SEMI-safe, accepts any array of 113

  • Im Grunde ist es das, was C dem Erstellen einer Klasse am nächsten kommt. Ich mag diese Antwort, weil sie dem am nächsten kommt, darauf hinzuweisen.

    – Nate CK

    7. August 2011 um 2:12 Uhr

  • So etwas wie eine Methode gibt es in C nicht. Strukturen in C sind einfache alte Daten. Es hat einen =-Operator, der standardmäßig unterstützt wird (was die anderen Antworten zeigen, ist der Grund dafür), aber das ist irreführend und gilt hauptsächlich für C++, nicht für C.

    – Jonathan Sternberg

    7. August 2011 um 5:48 Uhr

  • @J Sternberg: “Methode” ist nur eine Art, über Unterroutinen nachzudenken, die sich auf die Daten-“Objekte” beziehen, auf die sie sich auswirken. Sie können sicherlich “Klassen” von “Objekten” und “Methoden” erstellen, die in C auf ihnen operieren. Die Sprache definiert solche Dinge nur nicht formal. Wenn Sie bessere Abstraktionen in C erstellen möchten, ist es normalerweise am besten, Dinge in eine Struktur zu stopfen.

    – Nate CK

    9. August 2011 um 18:16 Uhr

  • Wenn Sie wirklich Methoden in C “erstellen” wollten, könnten Sie außerdem Funktionszeiger (ja, ja, knifflige Syntax, kein Datenschutz usw.) verwenden, um Funktionen mit den Daten zu verknüpfen, mit denen sie arbeiten. Sie müssen “self” im ersten Argument übergeben (Sie könnten es sogar “this” nennen, wenn Sie wollten), da es keine automatische Erstellung dieses Zeigers innerhalb der Funktion in C gibt. Natürlich ist es alles Gymnastik, verstehen Sie Dinge wie diese standardmäßig in C ++, obwohl es stimmt, dass als Bonus ein versteckter Overhead vorhanden sein könnte …

    – BenPen

    12. Dezember 2018 um 16:23 Uhr

  • @NateC-K eine Struktur ist nur eine Struktur und es besteht keine Notwendigkeit, eine Funktion aufzurufen, die auf einer Struktur-‘Methode’ arbeitet. In diesem Zusammenhang ist „Klasse“ etwas irreführend. Denn eigentlich geht es beim Packen des Arrays in eine Struktur darum, es kopierbar zu machen. Im Gegensatz dazu nehmen Methoden ihre ‘this’-Klasse als Referenz. Auch der ganze Klassen-/Methoden-Jargon macht mehr Sinn in Verbindung mit Typ-Klassen-Polymorphismus, der in c nicht wirklich existiert

    – johannes_lalala

    10. April um 22:10 Uhr


Benutzeravatar von Aniket
Aniket

Eine Struktur kann Array-Initialisierungs-, Kopier- und Endfunktionen enthalten, die einige der Vorteile der OOP-Speicherverwaltungsparadigmata emulieren. Tatsächlich ist es sehr einfach, dieses Konzept zu erweitern, um ein generisches Speicherverwaltungsdienstprogramm zu schreiben (indem die sizeof()-Struktur verwendet wird, um genau zu wissen, wie viele Bytes verwaltet werden), um jede benutzerdefinierte Struktur zu verwalten. Viele der in C geschriebenen intelligenten Produktionscodebasen verwenden diese stark und verwenden normalerweise nie ein Array, es sei denn, sein Geltungsbereich ist sehr lokal.

Tatsächlich könnten Sie für ein in eine Struktur eingebettetes Array andere “intelligente Dinge” tun, z. B. eine Begrenzungsprüfung, wann immer Sie auf dieses Array zugreifen möchten. Nochmals, es sei denn, der Bereich des Arrays ist sehr begrenzt, es ist eine schlechte Idee, es zu verwenden und Informationen zwischen Programmen herumzureichen. Früher oder später werden Sie auf Fehler stoßen, die Sie nachts wach halten und Ihre Wochenenden ruinieren.

  • Dies beantwortet nicht die Frage, warum man a verwenden könnte struct enthält nur eine Anordnung.

    – PJTrail

    16. August 2015 um 11:47 Uhr

1423460cookie-checkWarum eine Struktur deklarieren, die nur ein Array in C enthält?

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

Privacy policy