Pointer ändert sich grundlos?!?



  • Hi,
    ich habe in Problem und zwar ändert sich die Adresse einesPointer nachdem Aufruf einer Funktion, die allerdings nur mit einer Referenz des gleichen arbeitet. Und kurz vor dem Ende der Funktion zeigt der Übergebene Pointer auch noch auf die richtige Adresse, aber direkt nachdem verlassen steht im Ursprungspointer auf einmal eine komplett andere Adresse.
    Ich brüte jetzt schon Stundenlang über dem Problem und komm einfach nicht weiter wäre schön wenn hier jemand helfen könnte. 🙂

    Hab hier mal die Main un die comm Funktion gepostet, glaube nicht das es an den anderen Funktionen leigt aber falls gewünscht poste ich die natürlich auch.

    int main(char argv[])
    {   
       test("Start");
    
       struct field field ;
    
       struct bot *white=(struct bot *)malloc(sizeof(struct bot)*9);
       struct bot *black=(struct bot *)malloc(sizeof(struct bot)*9);
       struct bot *t2;
       init_field(&field);
       initBots(white,9,30,'W');
       initBots(black,9,60,'B');
       printf("\nWhite:%p Black:%p t2:%p\n",white,black,t2);
        t2=white;
        printf("\nWhite:%p Black:%p t2:%p\n",white,black,t2);
       while(!comm(&field,t2))   //Bis Spielende
       {
          printf("\nWhite:%p Black:%p t2:%p\n",white,black,t2);                                            
          if(t2==white)    //Spieler wechseln
          {
                       printf("schwarz is\n");
    
             t2=black;
          }else
          {
               printf("weiß is\n");
               t2=white;
          }
          printf("\nWhite:%p Black:%p t2:%p\n",white,black,t2);
          test("abc34");
       }
      test("Ende");
    
    }
    
    int comm(struct field *field,struct bot *bot)
    {
        struct bot *T3000;
        struct best_mv *moves,*best_mv;
        int i,phase,k=0;
    
        for(i=0;i<9;i++)
        {             
           T3000=(bot+i);
    
           if(T3000->condition=='a')        // Überprüfen in welcher Spielphase wir sind
           {
               phase=1;
           }else
           {
               phase=0; 
           }
          // printf("Aufruf:CheckMoves\n");
    
           moves=checkMove(T3000,field,phase);    //Mögliche Züge für den Bot berechnen und bewerten
    
           if(moves && moves->weight>k)         //Besten Zug aller Bots ermitteln
           {
               printf("New Best Move dest:%d weight:%d\n",moves->dest,moves->weight);
               k=moves->weight;
               best_mv=moves;
           }         
        } 
        if(k==0)       // Kein Möglicher Zug gefunden ->Spielende
        {
            test("Spielende");
            return(1);    
        }
        printf("Aufruf:exec_move\n");
        exec_move(field,best_mv->bot,best_mv->dest);  //Zug ausführen 
        free(best_mv);
        free(moves);
        printf("last-T3000:%p bot:%p\n",T3000,bot);
        return(0);  
    }
    

    Programm Ausgabe

    Start
    
    White:003D4868 Black:003D4900 t2:7C92056D
    
    White:003D4868 Black:003D4900 t2:003D4868
    New Best Move dest:1 weight:16
    New Best Move dest:1 weight:24
    New Best Move dest:1 weight:26
    Aufruf:exec_move
    last-T3000:003D48E8 bot:003D4868
    
    White:0000004F Black:003D4900 t2:003D4868
    wei▀ is
    
    White:0000004F Black:003D4900 t2:0000004F
    abc34
    


  • HiFish schrieb:

    Ich brüte jetzt schon Stundenlang über dem Problem und komm einfach nicht weiter wäre schön wenn hier jemand helfen könnte. 🙂

    Laß es im Debugger laufen, setz' Breakpoints und/oder schau dir die Variableninhalte an. wenn du keinen Debugger oder nur den GDB hast, spick' den Code mit 'puts'-Ausgaben an entscheidenden Stellen. Mit ein paar Debuggingtechniken findest du den Fehler bestimmt selbst.



  • was heißt hier

    nur den GDB

    ?
    GDB is doll!
    naja, mit einigen ausnahmen und so... multithreaded is der net wirklich toll



  • Du solltest nichts 'befreien', was du nicht angefordert hast:

    free(best_mv); 
    free(moves);
    


  • Die pointer move und best_mv werden in der checkMoves alloziiert.

    Ich hab es soweit debuggt das ich weiß, das der white pointer vor dem Aufruf der comm Funktion noch korrekt ist.

    t2=white;
    printf("\nWhite:%p Black:%p t2:%p\n",white,black,t2); //White:003D4868 Black:003D4900 t2:003D4868
    while(!comm(&field,t2))
    

    White:003D4868 Black:003D4900 t2:003D4868

    Am Ende der Comm Funktion gebe ich den referenzierten Pointer aus auch hier stimmt die Adresse noch.

    printf("last-T3000:%p bot:%p\n",T3000,bot); //last-T3000:003D48E8 bot:003D4868
        return(0);
    

    last-T3000:003D48E8 bot:003D4868

    Nach der Rückkehr stimmt der white Pointer jedoch auf einmal nicht.

    printf("\nWhite:%p Black:%p t2:%p\n",white,black,t2);    //White:0000004F Black:003D4900 t2:003D4868                                         
          if(t2==white)    //Spieler wechseln
          {
    

    White:0000004F Black:003D4900 t2:003D4868

    Weshalb und wieso weiß ich nicht und habe auch keine Ahnung wie ich das rauskriegen kann 😕



  • HiFish schrieb:

    Die pointer move und best_mv werden in der checkMoves alloziiert.

    Erstens passiert das nur mit move (best_mv zeigt nur auf denselben Speicherbereich, und darf damit nicht freigegeben werden). Zweitens gibst du nur eine (durch die falsche Freigabe von best_mv bestenfalls 2) der 9 Allokationen wieder frei. Schönes Speicherleck.



  • Stimmt da hast du recht hab das mal bei mir geändert, ändert aber nixs an dem eigentlichen Problem.


Anmelden zum Antworten