0 Tage Serie
Code-Bibliothek

Code, der lesenswert ist.

Sorgfältig kuratierte Snippets — TypeScript, Python, Rust, Go und mehr. Jedes mit einer Zeile-für-Zeile-Erklärung, damit du Code so liest, wie die Leute ihn geschrieben haben.

3498 Snippets · 10 Sprachen
▶ Lernen starten
C · MittelSnippet

Statische Variablen in Funktionen

Eine statische lokale Variable behält ihren Wert zwischen Funktionsaufrufen bei und wird nur einmal beim Programmstart initialisiert.

snippet.c
c
1
2
3
4
5
void track_calls() {
static int count = 0;
count++;
printf("Called %d times\n", count);
}
Memory ManagementBest Practices
C · MittelSnippet

Bitweise Flag-Manipulation

Bitweise Operatoren werden verwendet, um mehrere boolesche Flags in einem einzigen Integer zu speichern, was sehr speichereffizient und schnell ist.

snippet.c
c
1
2
3
4
5
6
7
8
#define READ (1 << 0)
#define WRITE (1 << 1)
unsigned char permissions = 0;
permissions |= READ;
if (permissions & READ) {
/* logic */
}
PerformanceSyntax
C · MittelSnippet

Zeigerarithmetik mit Arrays

In C zerfallen Array-Namen in Zeiger. Das Addieren eines Integers zu einem Zeiger bewegt den Zeiger um diese Anzahl von Elementen, nicht um Bytes.

snippet.c
c
1
2
3
4
int arr[] = {10, 20, 30};
int *ptr = arr;
int val = *(ptr + 2);
Arrays & ListenMemory Management
C · MittelSnippet

Dynamischer Speicher für Strukturen

Die Verwendung von malloc zur Speicherallokation für Strukturen auf dem Heap ist essenziell, wenn Größe oder Lebensdauer der Daten zur Kompilierzeit unbekannt sind.

snippet.c
c
1
2
3
4
5
6
7
typedef struct { int id; char *name; } User;
User *u = (User *)malloc(sizeof(User));
if (u != NULL) {
u->id = 1;
free(u);
}
Memory ManagementDatentypen
C · MittelSnippet

Speichereffizienz mit Unions

Eine Union ermöglicht es, verschiedene Datentypen im selben Speicherbereich zu speichern. Die Größe der Union wird durch ihr größtes Element bestimmt. Dies ist besonders in der Systemprogrammierung nützlich, um Datenstrukturen zu überlagern oder auf bestimmte Teile eines Speicherworts zuzugreifen.

snippet.c
c
1
2
3
4
5
6
7
union HardwareRegister {
uint32_t full_word;
struct {
uint16_t lower_half;
uint16_t upper_half;
} parts;
};
DatentypenMemory Management
C · MittelSnippet

Sichere mehrzeilige Makros mit do-while(0)

Das Einschließen eines Makros mit mehreren Anweisungen in einen 'do { ... } while (0)'-Block stellt sicher, dass es sich wie eine einzelne Anweisung verhält. Dies verhindert Logikfehler, wenn das Makro in 'if'-Anweisungen ohne geschweifte Klammern verwendet wird, und erzwingt ein Semikolon.

snippet.c
c
1
2
3
4
#define SAFE_FREE(ptr) do { \
free(ptr); \
ptr = NULL; \
} while (0)
SyntaxBest PracticesMemory Management
C · MittelSnippet

Optimierung mit dem restrict-Schlüsselwort

Der 'restrict'-Qualifier ist ein Hinweis an den Compiler, dass während der Lebensdauer des Pointers nur der Pointer selbst oder ein davon abgeleiteter Wert verwendet wird, um auf das Objekt zuzugreifen. Dies ermöglicht dem Compiler Optimierungen wie die Vektorisierung, die ansonsten aufgrund von möglichem Pointer-Aliasing unsicher wären.

snippet.c
c
1
2
3
4
5
void add_arrays(int *restrict a, int *restrict b, int *restrict result, int n) {
for (int i = 0; i < n; i++) {
result[i] = a[i] + b[i];
}
}
PerformanceMemory ManagementSyntax
C · MittelSnippet

Variadische Funktionen mit stdarg.h

Variadische Funktionen ermöglichen es, eine variable Anzahl von Argumenten an eine Funktion zu übergeben. Dies wird mit den in <stdarg.h> definierten Makros erreicht. Man muss mindestens ein festes Argument (wie 'count') angeben, um zu wissen, wo die Liste beginnt.

snippet.c
c
1
2
3
4
5
6
7
8
9
10
#include <stdarg.h>
void print_log(int count, ...) {
va_list args;
va_start(args, count);
for (int i = 0; i < count; i++) {
printf("%s ", va_arg(args, char*));
}
va_end(args);
}
FunktionenSyntax