?
Wenn du per
char *s;
einen Zeiger deklarierst, zeigt dieser zunächst nirgendwohin. Ihn zu dereferenzieren erzeugt undefiniertes Verhalten (d.h., der Standard definiert nicht, was eine Implementation in so einem Fall zu tun hat). So etwas sollte man vermeiden. Bevor du ihn benutzen kannst, musst du ihn initialisieren; in diesem Fall musst du ihn auf einen Speicherbereich zeigen lassen, der ausreichend groß ist, um den String zu fassen.
Im Falle von strcat wird der Speicherbereich, an den etwas angehängt werden soll, als erster Parameter übergeben. Beispiel:
char a[256] = "Hallo";
strcat(a, ", Welt!");
puts(a);
wird "Hallo, Welt!" ausgeben. Es ist wichtig, sicherzustellen, dass in a genug Platz ist, um den kombinierten String aufzunehmen.
Die restrict-Schlüsselwörter in
char * strcat(char * restrict dst, const char * restrict src);
versprechen dem Compiler, dass dst und src nie gleich sind (und nicht in den gleichen String zeigen). Genauer: Der restrict-Qualifier verspricht, dass innerhalb des Gültigkeitsbereichs des betreffenden Zeigers alle Zugriffe auf das Objekt, auf das der Zeiger zeigt, durch diesen Zeiger geschehen. Du kannst Kopien des Zeigers ziehen, aber wenn bei Eintritt in seinen Geltungsbereich ein anderer Zeiger das selbe Objekt referenziert, ist das Verhalten undefiniert.
Dadurch kann ein optimierender Compiler schnelleren Code erstellen.
while(*quelle) {
/* ... */
}
heißt: Tu etwas so lange, wie das, worauf quelle zeigt, wahr ist. "Wahr" heißt hier "ungleich null", und da per Konvention Strings in C mit einem Null-Byte enden, heißt es hier "bis zum Ende des Strings".