Typen
| Typ | Größe (typisch) | Platzhalter |
|---|---|---|
char | 1 Byte | %c, %d |
short | 2 | %hd |
int | 4 | %d |
unsigned int | 4 | %u |
long | 4/8 | %ld |
long long | 8 | %lld |
float | 4 | %f |
double | 8 | %f (printf), %lf (scanf) |
size_t | 8 (64 Bit) | %zu |
| Zeiger | 8 (64 Bit) | %p |
int32_t, uint8_t, ... | genau festgelegt | <stdint.h>, <inttypes.h> (PRId32) |
Operatoren (nach Rangfolge, stark → schwach)
() [] . -> · ! ~ ++ -- * (Dereferenz) & sizeof (typ) · * / % · + - · << >> · < <= > >= · == != · & · ^ · | · && · || · ?: · = += ... · ,
Wichtige Funktionen der Standardbibliothek
| Header | Funktionen |
|---|---|
<stdio.h> | printf, scanf, sscanf, snprintf, fgets, fputs, fopen, fclose, fread, fwrite, perror, getchar, putchar |
<stdlib.h> | malloc, calloc, realloc, free, exit, atoi, strtol, strtod, qsort, bsearch, rand, srand, abs |
<string.h> | strlen, strcmp, strncmp, strcpy, strncpy, strcat, strchr, strstr, memcpy, memmove, memset, memcmp |
<ctype.h> | isalpha, isdigit, isspace, isupper, toupper, tolower |
<math.h> | sqrt, pow, sin, cos, fabs, floor, ceil, round, fmod, log (mit -lm) |
<time.h> | time, clock, strftime, localtime |
<stdbool.h> | bool, true, false |
<stdint.h> | feste Ganzzahltypen |
<limits.h>, <float.h> | INT_MAX, DBL_EPSILON, ... |
<assert.h> | assert(bedingung) für Annahmen im Code |
<errno.h> | errno für Fehlerursachen |
Kleine Muster
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define LEN(a) (sizeof (a) / sizeof (a)[0])
typedef struct { int id; char name[16]; } Eintrag;
static int nach_id(const void *a, const void *b) {
return ((const Eintrag *) a)->id - ((const Eintrag *) b)->id;
}
int main(void) {
// Array-Länge
int z[] = {4, 8, 15, 16, 23, 42};
printf("%zu\n", LEN(z));
// Sortieren und binär suchen
Eintrag e[] = { {3, "c"}, {1, "a"}, {2, "b"} };
qsort(e, LEN(e), sizeof e[0], nach_id);
Eintrag such = { 2, "" };
Eintrag *treffer = bsearch(&such, e, LEN(e), sizeof e[0], nach_id);
printf("%s\n", treffer ? treffer->name : "nicht gefunden");
// Zufallszahl 1..6
srand((unsigned) time(NULL));
int w = rand() % 6 + 1;
printf("%d\n", w >= 1 && w <= 6);
// String umkehren
char s[] = "Hallo";
for (size_t i = 0, j = strlen(s) - 1; i < j; i++, j--) { char t = s[i]; s[i] = s[j]; s[j] = t; }
printf("%s\n", s);
return 0;
}6 b 1 ollaH
Compiler-Optionen
| Option | Wirkung |
|---|---|
-std=c17 | Sprachstandard |
-Wall -Wextra -Wpedantic | Warnungen |
-Werror | Warnungen als Fehler |
-g | Debuginformationen |
-O0, -O2, -O3, -Os | Optimierung (keine, normal, hoch, klein) |
-c | nur übersetzen, nicht linken |
-o name | Ausgabedatei |
-lm, -lpthread | Bibliotheken binden |
-Ipfad, -Lpfad | Suchpfade für Header / Bibliotheken |
-DNAME=wert | Makro definieren |
-fsanitize=address,undefined | Laufzeitprüfung |
-E, -S | nur Präprozessor / Assembler ausgeben |
Debuggen mit gdb
gcc -g -O0 -o prog prog.c
gdb ./prog
(gdb) break main Haltepunkt setzen
(gdb) run starten
(gdb) next / step Zeile weiter / in Funktion hinein
(gdb) print variable Wert ansehen
(gdb) backtrace Aufrufkette zeigen
(gdb) watch variable stoppen, wenn sich der Wert ändert
(gdb) continue / quitHäufige Fehlermeldungen
| Meldung | Bedeutung |
|---|---|
Segmentation fault | ungültiger Speicherzugriff (NULL, Überlauf, dangling pointer) |
undefined reference to 'f' | Linker findet Funktion nicht (Datei/-l fehlt) |
implicit declaration of function | Header fehlt |
incompatible pointer type | falscher Zeigertyp |
format '%d' expects argument of type 'int' | Platzhalter passt nicht |
stack smashing detected | Pufferüberlauf auf dem Stack |
double free or corruption | zweimal free oder Heap beschädigt |
Weiterlernen
- Buch: The C Programming Language (Kernighan und Ritchie), Modern C (Jens Gustedt, frei online)
- Referenz: cppreference.com (C-Teil),
man 3 funktionauf Linux - Üben: Exercism, Advent of Code, eigene Projekte (Shell, Texteditor, Hash-Tabelle, kleiner Interpreter)
- Danach: C++ (Klassen, Templates) oder Rust (Speichersicherheit zur Compilezeit)