EMZETT.
Login

Kurz: () [] . -> · ! ~ ++ — * (Dereferenz) & sizeof (typ) · * / % · + - · << >> · < <= > >= · == != · & · ^ · | · && · || · ?: · = += … · ,

Teil des Kurses C

Kapitel 15 von 15 im Kurs C (Abschnitt „Nachschlagen“). Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

Typen

TypGröße (typisch)Platzhalter
char1 Byte%c, %d
short2%hd
int4%d
unsigned int4%u
long4/8%ld
long long8%lld
float4%f
double8%f (printf), %lf (scanf)
size_t8 (64 Bit)%zu
Zeiger8 (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

HeaderFunktionen
<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;
}

Ausgabe:

6
b
1
ollaH

Compiler-Optionen

OptionWirkung
-std=c17Sprachstandard
-Wall -Wextra -WpedanticWarnungen
-WerrorWarnungen als Fehler
-gDebuginformationen
-O0, -O2, -O3, -OsOptimierung (keine, normal, hoch, klein)
-cnur übersetzen, nicht linken
-o nameAusgabedatei
-lm, -lpthreadBibliotheken binden
-Ipfad, -LpfadSuchpfade für Header / Bibliotheken
-DNAME=wertMakro definieren
-fsanitize=address,undefinedLaufzeitprüfung
-E, -Snur 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 / quit

Häufige Fehlermeldungen

MeldungBedeutung
Segmentation faultungültiger Speicherzugriff (NULL, Überlauf, dangling pointer)
undefined reference to 'f'Linker findet Funktion nicht (Datei/-l fehlt)
implicit declaration of functionHeader fehlt
incompatible pointer typefalscher Zeigertyp
format '%d' expects argument of type 'int'Platzhalter passt nicht
stack smashing detectedPufferüberlauf auf dem Stack
double free or corruptionzweimal 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 funktion auf Linux
  • Üben: Exercism, Advent of Code, eigene Projekte (Shell, Texteditor, Hash-Tabelle, kleiner Interpreter)
  • Danach: C++ (Klassen, Templates) oder Rust (Speichersicherheit zur Compilezeit)

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Undefiniertes Verhalten und sicheres C

Alle Kapitel: C im Überblick