Robert B.: ctemplate.h

Beitrag lesen

Moin pl,

Eine 0 in char *string = 0 ist völlig Ok, 1. wird der Pointer initialisiert und 2. funktionieren damit die Kontrollstrukturen. D.h., ein if(string) würde immer wahr ergeben wenn string = "" (Leerstring) ist und das ist schlecht. Mit 0 initialisiert hingegen klappt das einwandfrei.

In C gibt es auch keine Strings, sondern nur Arrays von Zeichen – und ein Array ist letztlich nur ein Pointer auf die erste Position der Elemente. Als „String“ wird ein Zeichenarray betrachtet, dessen letztes Zeichen 0 ist. Daher ist "" auch ein Zeichenarray der Länge 1, bestehend aus dem NULL-Byte und mit einer von 0 unterschiedlichen Position im Speicher. Dein Vergleich if(string) müsste daher in C heißen

if (strlen(string)) {
    /* … */
}

Gleichermaßen verhält es sich mit den Rückgabewerten von Funktionen wenn das Stringspointer sein sollen char *func(){}. So gibt es ein return 0; wenn meine Funktion beim Durchlaufen einer verketteten Liste den gesuchten String nicht gefunden hat ansonsten einen Zeiger auf den String.

Vorsicht:

char* func(char *arg) {
    char intern[23];
    static char ext[42];
    char *dynamic = (char*) malloc(42);

    /* Führt zu undefiniertem Verhalten, weil die Variable nur im Scope der Funktion existiert:
     * return intern;
     */

    /* Funktioniert, erfordert aber ggf. eine Kopie des statischen Strings:
     * return ext;
     */

    /* Funktioniert, String muss aber nach Verwendung freigegeben werden um Memoryleaks zu vermeiden:
     * return dynamic;
     */

    return 0;
}

Viele Grüße
Robert