Speicherklassen in C verstehen: auto, extern, static, register erklärt
Was ist eine Speicherklasse in C?
Es gibt vier Standard-Speicherklassen:
- auto – Standard für lokale Variablen.
- extern – Deklariert eine globale Variable oder Funktion, die in einer anderen Datei existiert.
- static – Bewahrt den Wert einer Variable zwischen Aufrufen und begrenzt Sichtbarkeit auf Datei oder Funktion.
- register – Hinweis an den Compiler, Variable in einem CPU-Register für schnelleren Zugriff zu speichern.
Auto Speicherklasse
Mit auto deklarierte Variablen (Standard für lokale Variablen) existieren nur innerhalb des Blocks, in dem sie definiert sind. Sie werden zerstört, wenn der Block verlassen wird, und werden mit einem unbestimmten Wert initialisiert, sofern nicht explizit gesetzt.
int add(void) {
int a = 13;
auto int b = 48; // auto ist optional
return a + b;
}
Gültigkeitsbereich-Demonstration:
#include <stdio.h>
int main(void) {
auto int j = 1;
{
auto int j = 2;
{
auto int j = 3;
printf("%d ", j); // gibt 3 aus
}
printf("\t%d ", j); // gibt 2 aus
}
printf("%d\n", j); // gibt 1 aus
}
Ausgabe: 3 2 1
Extern Speicherklasse
Das extern-Schlüsselwort deklariert eine Variable oder Funktion, die in einer anderen Translationseinheit definiert ist. Es ermöglicht Datenaustausch über Quelldateien hinweg.
/* main.c */
#include <stdio.h>
extern int i; // Deklaration
int main(void) {
printf("value of the external integer is = %d\n", i);
return 0;
}
/* original.c */
#include <stdio.h>
int i = 48; // Definition
Beide Dateien zusammen kompilieren: gcc main.c original.c -o program. Ausführung von ./program ergibt:
value of the external integer is = 48
Static Speicherklasse
Static-Variablen behalten ihren Wert für die Dauer des Programms. Sie können als lokale Statics oder Datei-Gültigkeitsbereich-Statics verwendet werden.
- Lokal static – nur innerhalb der Funktion sichtbar, aber über Aufrufe hinweg persistent.
- Datei-Gültigkeitsbereich static – nur innerhalb der Datei sichtbar, in der deklariert.
/* global static */
static int counter = 7;
void next(void) {
/* lokal static */
static int iteration = 13;
iteration++;
printf("iteration=%d and counter=%d\n", iteration, counter);
}
int main(void) {
while (counter < 10) {
next();
counter++;
}
return 0;
}
Ausgabe:
iteration=14 and counter=7 iteration=15 and counter=8 iteration=16 and counter=9
Register Speicherklasse
Verwenden Sie register, wenn eine Variable häufig zugegriffen werden muss und in ein CPU-Register passt. Der Compiler kann den Hinweis ignorieren, wenn Register knapp sind.
#include <stdio.h>
int main(void) {
register int weight;
/* Adresse nehmen schlägt fehl */
// int *ptr = &weight; // Kompilierfehler
return 0;
}
Kompilierung ergibt:
error: address of register variable 'weight' requested
Zusammenfassungstabelle
| Speicherklasse | Deklarationskontext | Speicherort | Standardwert | Gültigkeitsbereich | Lebensdauer |
|---|---|---|---|---|---|
| auto | innerhalb Funktion/Block | Speicher | Unbestimmt | Funktion/Block | Funktion/Block |
| register | innerhalb Funktion/Block | CPU-Register | Unbestimmt | Funktion/Block | Funktion/Block |
| extern | außerhalb aller Funktionen | Speicher | Null | Gesamtes Programm | Programmlaufzeit |
| static (lokal) | innerhalb Funktion/Block | Speicher | Null | Funktion/Block | Programmlaufzeit |
| static (global) | außerhalb aller Funktionen | Speicher | Null | Datei | Programmlaufzeit |
Wichtigste Erkenntnisse
- Speicherklassen steuern Sichtbarkeit und Lebensdauer von Variablen.
- Verwenden Sie
autofür Standard-Lokalvariablen. - Verwenden Sie
registerfür performance-kritische Zähler (abhängig von Compiler-Unterstützung). - Verwenden Sie
static, um Zustand über Funktionsaufrufe zu bewahren oder Datei-Gültigkeitsbereich zu begrenzen. - Verwenden Sie
extern, um Variablen oder Funktionen zwischen Quelldateien zu teilen.
C Sprache
- C# Klassen & Objekte: Fundamente für robustes OOP
- C# Static Keyword: Statische Variablen, Methoden und Klassen meistern
- C# Geschachtelte Klassen verstehen: Definition, Verwendung und Vererbung
- C++ Klassen & Objekte: Praktischer Leitfaden zur objektorientierten Programmierung
- C++ Friend-Funktionen und Friend-Klassen: Zugriffskontrolle meistern
- C++ Klassentemplates meistern: Ein praktischer Leitfaden
- C Speicherklassen verstehen: Gültigkeitsbereich, Lebensdauer und Performance
- C-Speicherklassen verstehen: Gültigkeitsbereich, Lebensdauer & Verwendung
- C++ Speicherklassen: Scope, Lifetime & Verwendung
- C++ Interfaces: Abstrakte Klassen & Pure Virtual Functions