char array muss erst einmal durchlaufen werden!?



  • Hallo Leute, ich habe ein - mir unerklärliches - Phänomen mit folgendem Code:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    char *double_trennzeichen(double wert)
    {
            char tmp[30], erg[30], *erg_ptr;
            int i, j=0;
    
            for(int i=0; i<30; i++) {
                    tmp[i] = '\0';
                    erg[i] = '\0';
            }
    
            sprintf(tmp,"%.0f", wert);
    
            for(i = 0; i < strlen(tmp); i++) {
                    if(((strlen(tmp) - i) % 3 == 0) && (i != 0)) {
                            erg[j] = '.';
                            j++;
                    }
                    erg[j] = tmp[i];
                    j++;
            }
    /*      Hier ist der Kern des Problems
            for(int i=0; i<30; i++) {
                    printf("tmp[%d]=%c  erg[%d]=%c\n", i, tmp[i], i, erg[i]);
            }
    */
            erg_ptr = erg;
            return erg_ptr;
    }
    
    int main(int argc, char *argv[])
    {
            double sum = 1234567890.00;
    
            printf("sum trennzeichen: %s\n", double_trennzeichen(sum));
            printf("sum normal      : %.0f\n", sum);
    
            return 0;
    }
    

    Wenn ich die for-Schleife auskommentiert lasse, ist die printf-Ausgabe in der main leer. Sobald ich die for-Schleife laufen lasse, gibt mir printf in der main den richtigen String aus.
    Ich bin total verwirrt... Kann mir das bitte mal jemand erklären??

    Thanks, DarthZiu



  • Deine Funktion gibt die Adresse einer lokalen Variablen zurück.



  • Ich weiß. Ursprünglich dachte ich ja, das es deswegen nicht funktioniert (dürfte auch nicht, da das char-Array nach der Rückkehr der Funktion eigentlich vernichtet wird).
    Aber wieso geht es, wenn ich in einer for-Schleife das Array durchlaufe?? Das ist die Sache, die ich einfach nicht kapiere.



  • wie sieht denn der output von deinem programm aus, wenn die schleife nicht auskommentiert ist?

    Sebastian



  • Das Problem ist einfach, dass du undefiniertes Verhalten mit der Rückgabe der Adresse des toten Arrays hervorrufst. Und das bedeutet, dass alles passieren kann. Wenn du Pech hast, löst du damit den 3. Weltkrieg aus. Wenn du Glück hast, funktioniert dein Programm fehlerfrei. Da du dich aber auf nichts verlassen kannst, programmiere einfach ohne undefiniertem Verhalten.



  • tmp[0]=1  erg[0]=1
    tmp[1]=2  erg[1]=.
    tmp[2]=3  erg[2]=2
    tmp[3]=4  erg[3]=3
    tmp[4]=5  erg[4]=4
    tmp[5]=6  erg[5]=.
    tmp[6]=7  erg[6]=5
    tmp[7]=8  erg[7]=6
    tmp[8]=9  erg[8]=7
    tmp[9]=0  erg[9]=.
    tmp[10]=  erg[10]=8
    tmp[11]=  erg[11]=9
    tmp[12]=  erg[12]=0
        .        .
        .        .
        .        .
    tmp[29]=  erg[29]=
    sum trennzeichen: 1.234.567.890
    sum normal      : 1234567890
    

    So siehts aus, wenn die for-Schleife läuft. (Wie man sieht, will ich double-Zahlen mit 1000-Trennzeichen ausgeben)


Anmelden zum Antworten