Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> C Sprache

C-Unions erklärt: Effizientes Speichermanagement für mehrere Datentypen

Eine Union ist ein spezieller Datentyp in C, der es erlaubt, verschiedene Datentypen an derselben Speicherstelle zu speichern. Sie können eine Union mit vielen Mitgliedern definieren, aber nur ein Mitglied kann zu einem gegebenen Zeitpunkt einen Wert enthalten. Unions bieten eine effiziente Möglichkeit, denselben Speicherort für mehrere Zwecke zu nutzen.

Eine Union definieren

Um eine Union zu definieren, verwenden Sie die union-Anweisung analog zur Strukturdefinition. Format:

union [union_tag] {
    mitglied_definition;
    mitglied_definition;
    ...
} [eine_oder_mehr_union_variablen];

Der Union-Tag ist optional. Jede Mitgliedsdefinition ist eine normale Variablendefinition. Am Ende können Sie optional Union-Variablen angeben. Beispiel für eine Union Data mit drei Mitgliedern:

union Data {
    int i;
    float f;
    char str[20];
} data;

Eine Variable vom Typ Data kann eine Ganzzahl, eine Gleitkommazahl oder einen String speichern. Derselbe Speicherort wird für verschiedene Datentypen wiederverwendet. Der Speicherbedarf einer Union entspricht der Größe des größten Mitglieds. Im obigen Beispiel belegt Data 20 Bytes (wegen char str[20]).

Beispiel: Speichergröße einer Union

#include <stdio.h>
#include <string.h>

union Data {
    int i;
    float f;
    char str[20];
};

int main() {
    union Data data;
    printf("Speichergröße von data: %zu Bytes\n", sizeof(data));
    return 0;
}

Ausgabe: Speichergröße von data: 20 Bytes

Auf Union-Mitglieder zugreifen

Zugriff erfolgt wie bei Strukturen mit dem Mitgliedszugriffsoperator (.). Verwenden Sie das Schlüsselwort union für Variablendeklarationen.

Beispiel: Falsche Verwendung (alle Mitglieder gleichzeitig)

#include <stdio.h>
#include <string.h>

union Data {
    int i;
    float f;
    char str[20];
};

int main() {
    union Data data;
    data.i = 10;
    data.f = 220.5;
    strcpy(data.str, "C Programming");
    
    printf("data.i: %d\n", data.i);
    printf("data.f: %f\n", data.f);
    printf("data.str: %s\n", data.str);
    return 0;
}

Ausgabe (korrupte Werte für i und f):

data.i: 1917853763
data.f: 4122360580327794860452759994368.000000
data.str: C Programming

Die Werte von i und f sind korrupt, da der letzte zugewiesene Wert (str) den Speicher belegt.

Beispiel: Richtige Verwendung (ein Mitglied zur Zeit)

#include <stdio.h>
#include <string.h>

union Data {
    int i;
    float f;
    char str[20];
};

int main() {
    union Data data;
    
    data.i = 10;
    printf("data.i: %d\n", data.i);
    
    data.f = 220.5;
    printf("data.f: %f\n", data.f);
    
    strcpy(data.str, "C Programming");
    printf("data.str: %s\n", data.str);
    
    return 0;
}

Ausgabe (alle korrekt):

data.i: 10
data.f: 220.500000
data.str: C Programming

Hier funktioniert alles, weil immer nur ein Mitglied zur Zeit verwendet wird – der eigentliche Zweck von Unions.

Union vs. Struktur

MerkmalStruktur (struct)Union
SpeicherSumme aller Mitglieder (+ Padding)Größe des größten Mitglieds
ZugriffAlle Mitglieder gleichzeitigNur ein Mitglied zur Zeit
AnwendungsfallZusammengehörige Daten (Record)Varianten/Alternative Darstellungen

Anonyme Unions (C11)

Seit C11 können Unions anonym in Strukturen eingebettet werden:

struct {
    int type;
    union {
        int int_val;
        float float_val;
        char *str_val;
    };
} variant;

Zugriff direkt über variant.int_val ohne Unionsnamen.

C Sprache

  1. Mikroprozessoren: Die Evolution des Stored-Program-Computing
  2. Umfassende Op‑Amp‑Daten: National Semiconductor & CA3130 Datenblätter
  3. C++-Datentypen verstehen: Grundlagen, Modifizierer und Best Practices
  4. C Datentypen erklärt: int, float, char und mehr – Ein vollständiger Leitfaden
  5. C-Unions erklärt: Definition, Nutzung & Vergleich mit Strukturen
  6. Python-Datentypen meistern: Praxisleitfaden
  7. C-Datentypen verstehen: Umfassender Leitfaden
  8. C++ Datenstrukturen: Arrays, Structs & mehr für effiziente Programme
  9. Datenabstraktion in C++: Interface-Implementierung-Trennung
  10. Datenkapselung in C++: Code schützen & strukturieren