Speicherklassen in C: Auto, Extern, Static, Register (Beispiele)

⚡ Intelligente Zusammenfassung

Speicherklassen in C definieren den Gültigkeitsbereich, die Lebensdauer, den Standardwert und den Speicherort jeder Variablen mithilfe von vier Spezifizierern – auto, register, static und extern –, um zu steuern, wo Daten gespeichert werden und wie lange sie während der Ausführung erhalten bleiben.

  • 🗂️ Vier Speicherklassen: C bietet die Spezifizierer auto, register, static und extern zur Beschreibung jeder Variablen.
  • 🏠 Cars: Die standardmäßige lokale Klasse, die auf ihren Block beschränkt ist und einen undefinierten Wert enthält, bis ihr ein Wert zugewiesen wird.
  • Neu registrieren: Fordert CPU-Registerspeicher an, um schneller auf häufig verwendete Variablen wie Zähler zugreifen zu können.
  • ♻️ Statisch: Speichert einen Variablenwert zwischen Funktionsaufrufen und setzt ihn bei der ersten Verwendung standardmäßig auf Null.
  • 🌐 Extern: Eine globale Variable oder Funktion wird in mehreren Quelldateien gemeinsam genutzt, ohne sie neu zu definieren.
  • 📊 Umfang und Lebensdauer: Jede Klasse legt fest, wo eine Variable sichtbar ist und wie lange sie gültig ist.

Speicherklassen in C

Was ist die Speicherklasse in C?

Eine Speicherklasse stellt die Sichtbarkeit und den Speicherort einer Variable dar. Sie gibt an, von welchem ​​Teil des Codes aus wir auf eine Variable zugreifen können. Eine Speicherklasse in C wird verwendet, um die folgenden Dinge zu beschreiben:

  • Der Variablenbereich.
  • Der Speicherort, an dem die Variable gespeichert wird.
  • Der initialisierte Wert einer Variablen.
  • Eine Lebensdauer einer Variablen.
  • Wer kann auf eine Variable zugreifen?

Daher wird eine Speicherklasse verwendet, um die Informationen über eine Variable darzustellen.

HINWEIS: Eine Variable ist nicht nur mit einem verknüpft Datentyp, sein Wert ist aber auch eine Speicherklasse.

Welche Arten von Speicherklassen gibt es in C?

Es gibt insgesamt vier Arten von Standardspeicherklassen. Die folgende Tabelle stellt die Speicherklassen in C dar.

Lagerklasse Zweck
Auto Es handelt sich um eine Standardspeicherklasse.
extern Es handelt sich um eine globale Variable.
statisch Es handelt sich um eine lokale Variable, die auch dann einen Wert zurückgeben kann, wenn die Kontrolle an den Funktionsaufruf übergeben wird.
Registrieren Es handelt sich um eine Variable, die in einem Register gespeichert wird.

Auto Storage-Klasse in C

Die mithilfe der Auto-Storage-Klasse definierten Variablen werden als lokale Variablen bezeichnet. Auto steht für automatische Speicherklasse. Eine Variable gehört standardmäßig zur automatischen Speicherklasse, wenn sie nicht explizit angegeben wird.

Der Gültigkeitsbereich einer Auto-Variable ist auf den jeweiligen Block beschränkt. Sobald die Steuerung den Block verlässt, wird der Zugriff zerstört. Das bedeutet, dass nur der Block, in dem die Auto-Variable deklariert ist, darauf zugreifen kann.

Ein Schlüsselwort auto wird verwendet, um eine automatische Speicherklasse zu definieren. Standardmäßig enthält eine Auto-Variable einen Müllwert.

Example, auto int age;

Das folgende Programm definiert eine Funktion mit zwei lokalen Variablen

int add(void) {
   int a=13;
   auto int b=48;
return a+b;}

Wir nehmen ein anderes Programm, das die Scope-Ebene „Sichtbarkeitsebene“ für Auto-Variablen in jedem Blockcode anzeigt, die unabhängig voneinander sind:

#include <stdio.h>
int main( )
{
  auto int j = 1;
  {
    auto int j= 2;
    {
      auto int j = 3;
      printf ( " %d ", j);
    }
    printf ( "\t %d ",j);
  }
  printf( "%d\n", j);}

Ausgang:

 3 2 1

Externe Speicherklasse in C

Extern steht für externe Speicherklasse. Die externe Speicherklasse wird verwendet, wenn wir globale Funktionen oder Variablen haben, die von zwei oder mehr Dateien gemeinsam genutzt werden.

Das Schlüsselwort extern wird verwendet, um eine globale Variable oder Funktion in einer anderen Datei zu deklarieren und so eine Referenz auf eine Variable oder Funktion bereitzustellen, die bereits in der Originaldatei definiert wurde.

Die mit einem externen Schlüsselwort definierten Variablen werden als globale Variablen bezeichnet. Auf diese Variablen kann im gesamten Programm zugegriffen werden. Beachten Sie, dass die externe Variable nicht initialisiert werden kann, da sie bereits in der Originaldatei definiert wurde.

Example, extern void display();

Erste Datei: main.c

#include <stdio.h>
extern i;
main() {
   printf("value of the external integer is = %d\n", i);
   return 0;}

Zweite Datei: original.c

#include <stdio.h>
i=48;

Ergebnis:

 value of the external integer is = 48

Um den obigen Code zu kompilieren und auszuführen, führen Sie die folgenden Schritte aus

Schritt 1) ​​Neues Projekt erstellen,

  • Wählen Sie Konsolenanwendung
  • Klicken Sie auf Los

Neues Projekt erstellen in Code Blockiert

Schritt 2) Wählen Sie C und klicken Sie auf Weiter

Wählen Sie die Sprache C aus.

Schritt 3) Klicken Sie auf Weiter

Klicken Sie auf Weiter

Schritt 4) Geben Sie Ihre Daten ein und klicken Sie auf Weiter

Projektdetails eingeben

Schritt 5) Klicken Sie auf Fertigstellen.

Klicken Sie auf Fertig stellen

Schritt 6) Fügen Sie den Hauptcode, wie im vorherigen Programm gezeigt, in die Datei main.c ein und speichern Sie sie.

Füge Code zu main.c hinzu.

Schritt 7) Erstellen Sie eine neue C-Datei [Datei -> Neu -> Leere Datei ], speichern Sie sie (als original.c) und fügen Sie sie dem aktuellen Projekt hinzu, indem Sie im Dialogfeld auf „OK“ klicken.

Erstelle die Datei original.c

Schritt 8) Speichern Sie den im vorherigen Beispiel gezeigten C-Code der Originaldatei original.c ohne die main()-Funktion.

Füge Code zu original.c hinzu.

Schritt 9) Erstellen und führen Sie Ihr Projekt aus. Das Ergebnis wird in der nächsten Abbildung dargestellt.

Programmausgabe

Statische Speicherklasse in C

Die statischen Variablen werden innerhalb der Funktion/Datei als lokale statische Variablen verwendet. Sie können auch als verwendet werden Globale Variable

  • Eine statische lokale Variable ist eine lokale Variable, die ihren Wert zwischen Funktionsaufrufen oder Blöcken beibehält und speichert und nur für die Funktion oder den Block sichtbar bleibt, in der sie definiert ist.
  • Statische globale Variablen sind globale Variablen, die nur in der Datei sichtbar sind, in der sie deklariert sind.
Example: static int count = 10;

Beachten Sie, dass die statische Variable einen Standardanfangswert von Null hat und nur einmal in ihrer Lebensdauer initialisiert wird.

#include <stdio.h> /* function declaration */
void next(void);
static int counter = 7; /* global variable */
main() {
 while(counter<10) {
      next();
      counter++;   }
return 0;}
void next( void ) {    /* function definition */
   static int iteration = 13; /* local static variable */
   iteration ++;
   printf("iteration=%d and counter= %d\n", iteration, counter);}

Ergebnis:

iteration=14 and counter= 7
iteration=15 and counter= 8
iteration=16 and counter= 9

Auf globale Variablen kann in der gesamten Datei zugegriffen werden, während auf statische Variablen nur für den jeweiligen Teil eines Codes zugegriffen werden kann.

Die Lebensdauer einer statischen Variablen liegt im gesamten Programmcode. Eine Variable, die mit dem Schlüsselwort static deklariert oder initialisiert wird, enthält immer Null als Standardwert.

Registrieren Sie die Speicherklasse in C

Sie können die Registerspeicherklasse verwenden, wenn Sie lokale Variablen innerhalb von Funktionen oder Blöcken stattdessen in CPU-Registern speichern möchten RAM um schnellen Zugriff auf diese Variablen zu haben. Beispielsweise sind „Zähler“ ein guter Kandidat für die Speicherung im Register.

Example: register int age;

Das Schlüsselwort `register` dient zur Deklaration einer Registerspeicherklasse. Variablen, die mit dieser Registerspeicherklasse deklariert werden, behalten ihre Lebensdauer während des gesamten Programms.

Es ähnelt der Auto-Storage-Klasse. Die Variable ist auf den jeweiligen Block beschränkt. Der einzige Unterschied besteht darin, dass die mithilfe der Registerspeicherklasse deklarierten Variablen in CPU-Registern und nicht in einem Speicher gespeichert werden. Auf das Register kann schneller zugegriffen werden als auf den Hauptspeicher.

Die mithilfe der Registerspeicherklasse deklarierten Variablen haben keinen Standardwert. Diese Variablen werden häufig zu Beginn eines Programms deklariert.

#include <stdio.h> /* function declaration */
main() {
{register int  weight;
int *ptr=&weight ;/*it produces an error when the compilation occurs ,we cannot get a memory location when dealing with CPU register*/}
}

Ausgang:

error: address of register variable 'weight' requested

Die folgende Tabelle fasst die wichtigsten Merkmale jeder Speicherklasse zusammen, die häufig in der C-Programmierung verwendet werden.

Speicherklasse Erklärung Lagerung Standardanfangswert Geltungsbereich Lebenslang
Auto Innerhalb einer Funktion/Block Memory Unberechenbar Innerhalb der Funktion/des Blocks Innerhalb der Funktion/des Blocks
Registrieren Innerhalb einer Funktion/Block CPU-Register Müll Innerhalb der Funktion/des Blocks Innerhalb der Funktion/des Blocks
extern Außerhalb aller Funktionen Memory Null Vervollständigen Sie die Datei und andere Dateien, in denen die Variable als extern deklariert ist Programmlaufzeit
Statisch (lokal) Innerhalb einer Funktion/Block Memory Null Innerhalb der Funktion/des Blocks Programmlaufzeit
Statisch (global) Außerhalb aller Funktionen Memory Null Globalen Programmlaufzeit

Häufig gestellte Fragen

Der Gültigkeitsbereich bestimmt, wo eine Variable im Code sichtbar ist, während die Lebensdauer festlegt, wie lange sie im Speicher verbleibt. Eine Variable kann einen Block-Gültigkeitsbereich haben, aber dennoch eine Lebensdauer über die gesamte Programmdauer besitzen.

Beide erzeugen blockbezogene lokale Variablen, aber „auto“ speichert sie mit einem ungültigen Standardwert im Speicher, während „register“ eine schnellere Speicherung in CPU-Registern anfordert und die Verwendung der Variablenadresse untersagt.

Nein. Die Angabe eines Registers ist lediglich eine Anfrage; der Compiler kann sie ignorieren, wenn kein Register frei ist. Moderne Compiler optimieren die Registernutzung automatisch, daher ist das Schlüsselwort heutzutage selten erforderlich.

Statische und externe Variablen befinden sich für das gesamte Programm in einem mit Nullen initialisierten Speicherbereich und beginnen daher bei Null. Automatische Variablen nutzen den Stack-Speicher wieder.ping welcher Wert auch immer zurückgeblieben war.

Eine externe Deklaration kennzeichnet lediglich eine Variable, die an anderer Stelle definiert ist, und kann nicht initialisiert werden. Die eigentliche Definition in einer separaten Datei reserviert den Speicherplatz, und die Verknüpfung stellt sicher, dass jede Referenz darauf zugreift.

Größtenteils, aber nicht ganz. C++ Das Schlüsselwort `register` wurde als veraltet markiert und `auto` für die Typinferenz umfunktioniert. `static` und `extern` verhalten sich jedoch ähnlich. C++ Fügt Thread-lokale und Klassenmember-Speicherregeln hinzu.

Ja. KI-Assistenten beschreiben auto, register, static und extern, schlagen den richtigen Spezifizierer für jede Variable vor und kennzeichnen Fehlverwendungen, wie z. B. die Verwendung der Adresse einer Registervariablen.

GitHub-Copilot Vervollständigt automatisch statische Zähler, externe Deklarationen über verschiedene Dateien hinweg und Registerhinweise und erklärt anschließend Gültigkeitsbereich und Lebensdauer direkt während der Eingabe.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: