Speicherverletzung / Pointer



  • Hallo Leute,

    ich arbeite zurzeit an einem Clienten.
    Hier der Code, um den es sich geht.

    char * pch; 
    char * pch2;
    
    pch = strtok(recvbuf,"#"); // muss vor der while stehen 
    
    while(pch != NULL ){   
    
    pch = strtok(NULL,"#");
    pch2 = strtok(NULL,"#");  //extra pch2 und nicht gleichen pointer verwendet
    
    while(*pch2 != ' '){    //HIER!!
    *pch2++;
    };
    
    };
    

    recvbuf ist ein Pointer auf ein Char, welches ich übergebe.
    Die whileschleife läuft ohne Probleme durch, nur nachdem die Bedingung zur Beendung der whileschleife auftritt, bricht es ab mit einem Speicherzugriffsfehler ab.

    Ich nutze CodeBlocks und MinGW.

    Danke



  • evtl. ist pch2 == NULL ???



  • Nein, leider auch nicht. Aber danke!



  • zuckerlie schrieb:

    Nein, leider auch nicht. Aber danke!

    versuch es mal mit

    char * pch;
    char * pch2;
    
    pch = strtok(recvbuf,"#"); // muss vor der while stehen
    
    while(pch != NULL ){  
    
    pch = strtok(NULL,"#");
    pch2 = strtok(NULL,"#");  //extra pch2 und nicht gleichen pointer verwendet
    
    while(pch2 != NULL){    //HIER!!
        pch2++;
    };
    
    };
    

    😉

    Wozu brauchst du überhaupt pch2?!? Irgendwie stimmt was in der logischen Abfolge nicht ...

    Oder wolltest du sowas in der Art machen?

    int len = strlen(pch);
    char *pch2 = pch; // jetzt zeigen beide auf die selbe Addresse
    
    for(int i = 0; i < len; i++) {
        if(pch2[i] != ' ')
            // tu was
    }
    


  • Auch das funktioniert leider nicht.

    Nein, es sollen zwei verschiedene Adressen sein.
    Da ich weiß, dass pch immer 4 ist, aber pch2 unterschiedlich und daher will ich dann die nullterminierung setzen.

    Ja, ich weiß, es sieht etwas komisch aus. Ich muss wissen wo der nächste Token (pch2) ein leerzeichen hat, wenn ja werde ich die nächsten 5 stellen auch nochmal nachschauen ob diese leerzeichen sind und falls ja, spring ich zurück und setz dort die Nullterminierung.

    Muss im Endeffekt, nach dem letzten Zeichen eine Nullterminierung setzen.

    Also es sollte über diesen Weg geschehen.

    char * pch;
    char * pch2;
    
    pch = strtok(recvbuf,"#");
    
    while(pch != NULL ){
    
    pch = strtok(NULL,"#");
    pch2 = strtok(NULL,"#");
    std::cout << pch << "@" << *pch2 << std::endl; //Bsp.
    
    };
    

    Mir ist gerade aufgefallen, sobald ich versuche auf *pch2 zuzugreifen, er mir diese ausgibt, aber bei dem letzten eine speicherverletzung entsteht, auch bei diesem abgeänderten code.



  • Wie viele '#' sind denn in deinem String?
    Gib mal ein Beispiel von deinem String und von dem was du als Ergebnis haben möchtest.



  • Ich glaube weil pch2 NULL ist.
    Du rufst nämlich 2 mal hintereinander strtok auf und versuchst auf pch2 zuzugreifen, indem du die Adresse bereits dereferenzierst (*pch2). Somit versuchst du bereits auf den Wert von der Addresse von pch2 zuzugreifen. Die Addresse ist aber vermutlich NULL, da strtok keine weiteren tokens mehr zurückgegeben hat.
    Prüf doch mal bitte auf

    if(pch2 == NULL)
       MessageBox(NULL, "Beep", "Beep", MB_OK);
    


  • Doch shadow, du hast doch recht 🙂 Es ist richtig, im letzten Vorgang innerhalb der Schleife wird angegeben, dass im letzten Durchlauf pch2 == NULL ist. Ich bin doch echt blöd, hätte ich doch wissen sollen 🙄

    @DirkB, habe den Fehler schon gefunden, aber danke 🙂

    Also vielen vielen Dank Leute 🙂



  • Ansonsten ein paar Tipps für die Zukunft:
    - Geb dir bei der Einrückung mehr mühe
    - Lass das Semikolon hinter } weg


Anmelden zum Antworten