🏗️ 1. Das C-Kompilationsmodell
C ist eine kompilierte, maschinennahe Systemsprache. Im Gegensatz zu interpretierten Sprachen durchläuft C-Quellcode vier fundamentale Phasen, bevor er als native Binärdatei direkt von der CPU ausgeführt wird:
[ Quellcode (.c / .h) ]
│
▼ (1. Präprozessor: Löst #include, #define, Makros auf)
[ Präprozessierter Code (.i) ]
│
▼ (2. Compiler: Übersetzt C in hardwarenahen Assemblercode)
[ Assembler-Code (.s) ]
│
▼ (3. Assembler: Generiert binären Maschinencode / Maschinensprache)
[ Objektdatei (.o / .obj) ]
│
▼ (4. Linker: Verknüpft Objektdateien & C-Standard-Bibliothek libc)
[ Ausführbare Binärdatei (ELF / .exe) ]
Präprozessor: Ersetzt alle Textbausteine und kopiert Blaupausen (#include <stdio.h>) in deine Werkstatt.
Compiler & Assembler: Die CNC-Fräse, die den Bauplan in millimetergenaue Metallkomponenten (Maschinencode 0101...) übersetzt.
Linker: Der Chefmechaniker, der Motor, Getriebe und Treibstofftank aus der Standard-Bibliothek zu einem fahrbereiten Rennwagen zusammenschraubt!
💾 2. Primitive Datentypen & Speichergrößen
In C besitzt jeder Datentyp eine feste Repräsentation im Arbeitsspeicher. Mit dem Operator sizeof() ermittelst du die exakte Byte-Größe zur Compile-Zeit:
| C-Datentyp | Typische Größe | Wertebereich | Format-Specifier |
|---|---|---|---|
char |
1 Byte (8 Bit) | -128 bis 127 (ASCII-Zeichen) | %c |
int |
4 Bytes (32 Bit) | -2.147.483.648 bis +2.147.483.647 | %d / %i |
float |
4 Bytes (32 Bit) | ~6-7 signifikante Dezimalstellen | %f |
double |
8 Bytes (64 Bit) | ~15-17 signifikante Dezimalstellen | %lf / %f |
size_t |
8 Bytes (64-Bit System) | Vorzeichenlose Array-/Speichergröße | %zu |
void* / Pointer |
8 Bytes (64-Bit System) | Hexadezimale Speicheradresse | %p |
⚠️ Typ-Konvertierung (Type Casting) & Ganzzahldivision
Wenn zwei Ganzzahlen dividiert werden, führt C eine Ganzzahldivision durch (Nachkommastellen werden abgeschnitten). Verwende expliziten Type-Cast:
int summe = 15;
int anzahl = 2;
// FALSCH: double avg = summe / anzahl; // Ergibt 7.0 (Datenverlust!)
// RICHTIG:
double avg = (double)summe / (double)anzahl; // Ergibt 7.5
🛡️ 3. Formatierte Ausgabe & Buffer-Sicherheit mit snprintf
In Produktions-C ist Buffer-Overflow der gefährlichste Sicherheitsfehler. Verwende niemals unbegrenztes sprintf, sondern immer snprintf mit Buffer-Größe:
#include <stdio.h>
char buffer[64];
int sensor_id = 42;
double temp = 23.456;
// Sicher formatieren mit Längenbegrenzung:
snprintf(buffer, sizeof(buffer), "Sensor #%03d: %.2f C", sensor_id, temp);
// Ergebnis in buffer: "Sensor #042: 23.46 C"
🎯 Aufgaben & Checkliste in aufgabe.c
Mit %.2f rundet printf die Fließkommazahl für die Anzeige kaufmännisch auf 2 Nachkommastellen. Mit %03d erzwingst du führende Nullen für dreistellige Sensornummern!