Mit verketteten Listen hat das zunächst nichts zu tun.
Mit
char *p = NULL;
deklariert man einen Pointer, der auf nichts zeigt.
Mit
p = malloc(Anzahl);
werden Anzahl Bytes Speicher angefordert, ist p danach nicht NULL, so
hat das Anfordern dieses Speichers geklappt.
Mit
free(p);
gibt man den Speicher wieder frei.
Will man die Größe des Speicherblocks verändern, geschieht dies mit
pneu = realloc(p, NeueAnzahl);
Dies vergrößert oder verkleinert den Speicherblock auf NeueAnzahl
Bytes.
Der Zugriff auf eine Element dieses angeforderten Speicherblocks
erfolgt analog zum Zugriff auf ein Element eines Arrays, wahlweise mit
den Array-Operatoren []
p[0] = 'A';
p[34] = 'B';
oder durch Dereferenzierung des Pointers
*p = 'A';
*(p + 34) = 'B';
Es muss sichergestellt werden, daß nicht über die Grenzen des mit
malloc/realloc angeforderten Speichers hinaus auf den Speicher
zugegriffen wird, aber das ist ja bei automatischen Variablen nicht
anders.
Im Gegensatz zu automatischen Variablen, die auf dem Stack angelegt
werden, werden Speicheranforderungen mit malloc auf dem Heap
ausgeführt.