Auflösen von übergebenem Pointer



  • Hi,

    ich hab gerade ein kleines Problem, bei dem ich auf dem Schlauch stehe:

    void functionA(char* zeiger1){
    
    MessageBox(NULL, zeiger1, blabla);
    }
    
    char** functionB(char* tokenize){
    /* Do something with tokenize, 
     * return char* Array.
     */
    }
    void functionC(char* message){
    char** zeiger2 = functionB(message);
    
    MessageBox(Null, zeiger2[0], ...);
    /* Erster MessageBox aufruf !!! */
    
    functionA(zeiger2[0]);
    }
    /* hier dann zweiter MessageBox aufruf - anderer Output! */
    

    So so sieht die Situation ungefähr aus. Jedoch unterscheiden sich die Ausgaben der beiden MessageBoxen die ich aufrufe - Warum ???
    An der functionB liegt es nicht, wie die erste MessageBox zeigt.
    ein char*-Array B hat einen char** type, also müsste B[0] ein char* sein. Wo liegt der Fehler ? Habe ich irgendwelche lebensdauern nicht beachtet ?



  • Hast du den Code genau so ausprobiert?
    bist du sicher, dass du nix an code weggelassen hast?
    So wies da steht sollte genau das selbe rauskommen.



  • Ok, gerade nochmal nachgeschaut - dazwischen passiert nix. Hier aber mal das Original.

    static void serv_ac(char* ac_num, SOCKET client_socket, HANDLE hToken){
     /* entspricht functionA(char* zeiger1) */
    
        char s[] = "TEST";
        MessageBox(NULL, ac_num,s, 0); /* Hier die erste MsgBox ausgabe 
                                        * ac_num hat den wert 8ý" 
                                        */
    }
    
    char** explode(char* msg){
      /* Das hier entspricht functionB(char* tokenize) 
       * Diese Funktion funktioniert nach allem Anschein - also eher uninteressant!
       */
        /* Delimiter Char */
        char Tok[] = "|";
        /*  Wir brauchen 3 Argumente für die MessageBox() Funktion - daher 3 Strings !
         *  type(result) == char**
         */
        char* result[(unsigned)3];
    
        unsigned char i = 0;
        char* tmp = strtok(msg,Tok);
        result[i] = tmp;
        while (tmp != NULL ){
            /* Kontroll Funktion
            MessageBox(NULL,  tmp, "Result",0);*/
    
            tmp = strtok(NULL, Tok);
    
            /* im Array result weiterschreiten und die Adresse vom nächsten String zuweisen */
            i = i+1;
            result[i]  = tmp;
        }
        return result;
    }
    
    static void echo(SOCKET client_socket, int ernum, char* exit_flag, HANDLE hToken){
        char buffer[BUFSIZE]; 
    
        /* blablabla ...
         */
    
        char** args ;
        args = explode(buffer);
        /* Hier die MessageBox ausgabe */
        MessageBox(NULL, args[0], args[2], 0); 
       /*args[2] hat hier den Wert  1   */
    
        serv_ac(args[2], client_socket, hToken, tkp); 
       /* hier die Übergabe an serv_ac(char* ac_num, ..) */
    }
    

    So, ich hoffe man findet durch. Also wenn ich dem Programm im dritten argument - und um dieses geht es hier - eine 1 übergeb, kommt einmal das ominöse 8ý" heraus und (vorher) die korrekte 1. Der Fehler muss in serv_ac(char* ac_num) liegen - aber ich verstehe nicht wo, denn da passiert nix mit dem Zeiger. Oder habe ich den speicherplatz nicht korrekt reserviert ? oder was ist mit den lebensdauern ?#

    Danke !



  • Floyd schrieb:

    Oder habe ich den speicherplatz nicht korrekt reserviert ? oder was ist mit den lebensdauern ?#

    Lebensdauer ist Dein Problem. Das array 'result' ist lokal in Funktion B bzw. explode, d.h. der zurückgegeben Zeiger auf dieses Array zeigt auf ungültigen Speicher.



  • yep - danke! Ich bin ein troll...


Anmelden zum Antworten