Gültigkeitsbereich von Variablen
Funktionen
Speicherverwaltung
benutzerdefinierte Datentypen
Außerhalb von Funktionen deklarierte Variablen sind global
Auf sie kann überall direkt zugegriffen werden
Sollte vermieden werden, wenn nicht unbedingt nötig
Innerhalb von Funktionen deklarierte Variablen sind lokal
char c;
void foo() { void foo() {
c = 'Z'; c = 'Z';
} }
int main() { int main() {
char c = 'A'; c = 'A';
foo(); foo();
} }
void swap(int32_t x, int32_t y) {
int32_t tmp = x;
x = y;
y = tmp;
}
int main() {
int32_t a = 10, b = 20;
swap(a, b);
printf("a=%"PRId32", b=%"PRId32"\n", a, b);
return 0;
}
Was wird ausgegeben?
void swap(int32_t *x, int32_t *y) {
int32_t tmp = *x;
*x = *y;
*y = tmp;
}
int main() {
int32_t a = 10, b = 20;
swap(&a, &b);
printf("a=%"PRId32", b=%"PRId32"\n", a, b);
return 0;
}
Was wird ausgegeben?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
malloc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
malloc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
malloc
malloc
gibt Zeiger auf Speicher der angefragten Größe zurück
auf diesen Speicher kann von überall zugegriffen werden
Speicher muss explizit per free
freigegeben werden (sonst Speicherleck, keine GC)
Angenommen wir wollen Daten zu einem Auto speichern, beispielsweise
#define ROT 1
#define BLAU 2
#define SCHWARZ 3
// ...
char marke[10];
uint16_t max_geschw;
uint8_t farbe;
Jetzt wollen wir mehrere Autos (5) verwalten
Mögliche Lösung:
char marke[5][10];
uint16_t max_geschw[5];
uint8_t farbe[5];
Nachteil: inhaltlich zusammenhängende Daten nicht zusammen
Idee: Wollen ein Konstrukt, das wir als Auto bezeichnen und welches jeweils die drei Eigenschaften beinhaltet
C bietet dafür sogenannte struct
-Datentypen an
struct Auto {
char marke[10];
uint16_t max_geschw;
uint8_t farbe;
};
struct Auto mein_auto = {"Tata", 135, ROT};
struct Auto dein_auto;
dein_auto.max_geschw = 80;
dein_auto.farbe = BLAU;
strncpy(dein_auto.marke, "Trabi", 10);
dein_auto.marke[9] = 0;
Wie bei Arrays sind struct
s einfach zusammenhängender Speicher
Lokal angelegte struct
-Variablen können nicht aus einer Funktion zurückgegeben werden ⇒ malloc
struct Auto * neuer_mercedes(uint8_t farbe) {
struct Auto * neu = malloc(sizeof(struct Auto));
(*neu).farbe = farbe; // So könnte man das benutzen
neu->max_geschw = 250; // So ist es gedacht
strncpy(neu->marke, "Mercedes", 10);
neu->marke[9] = 0;
return neu;
}
Gültigkeitsbereich von Variablen
Funktionen
Speicherverwaltung
benutzerdefinierte Datentypen