Wieder mal ein Zeiger Problem



  • Hallo,
    ich habe eine kleine Funktion geschrieben welche mir alle Werte einer Stringtabelle "entschlüsselt".
    Nur leider stürtzt das Programm dann immer bei dieser einen Zeile ab:

    char *password[] = {"546572","5657256"};
    
    void DecryptVariable(char *str,int len) {
    	int ansii=0,i=0,count=0;
    	char buf[512];
    
    	memset(buf,0,sizeof(buf));
    
    	for(i=0; i<len; i++) {
    		ansii = str[i];
    		ansii = ansii - 1;
    		str[i] = (char)ansii; //Hier stürtzt das Programm immer ab
    	}
    
    }
    
    INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, INT iCmdShow) {
    	int len=0;
    
    	len = strlen(url[0]);
    	DecryptVariable(url[0],len);
    

    Was ist mein Fehler bei diesem Code?
    Sitze schon fast den ganzen Tag dran habe auch verschiedene Sachen ausprobiert aber es will einfach nicht laufen.
    Bitte kann mal jemand drüber gucken?


  • Mod

    So spontan sehe ich keinen Fehler, auch wenn einiges unnötig umständlich ist. Geh doch mal mit dem Debugger durch und guck, warum es abstürzt.

    edit: Kann es sein, dass url[0] ein const char[] ist?



  • Wie lautet die Fehlermeldung?
    Bei welchem i?
    Was ist url ?



  • Sorry oben in dem Code hatte ich eben was verwechselt:

    char *password[] = {"546572","5657256"};
    
    void DecryptVariable(char *str,int len) {
        int ansii=0,i=0,count=0;
        char buf[512];
    
        memset(buf,0,sizeof(buf));
    
        for(i=0; i<len; i++) {
            ansii = str[i];
            ansii = ansii - 1;
            str[i] = (char)ansii; //Hier stürtzt das Programm immer ab
        }
    
    }
    
    INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, INT iCmdShow) {
        int len=0;
    
        len = strlen(password[0]);
        DecryptVariable(password[0],len);
    

    Laut Debugger stürtzt er hier ab:

    str[i] = (char)ansii; //Hier stürtzt das Programm immer ab
    

    Fehlermeldung:

    Unbehandelte Ausnahme bei 0x001882dd in project.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x001d3c6c.



  • mit url[0] übergibst Du doch keinen char*, oder doch?

    Hätte eigentlich die Typprüfung abfangen müssen ...



  • password ist ein Array aus zwei Zeigern, die je auf String-Literale verweisen. Und ein String-Literal darf nicht geschrieben werden. Die Lösung dürfte darin bestehen, stattdessen ein mehrdimensionales char-Array zu verwenden.

    PS: Dir ist hoffentlich klar, das dieses Verfahren nicht besonders sicher ist, wenn jemand wirklich bemüht ist, dein Passwort herauszufinden.



  • Kannst es gerne noch ein paar mal umbenennen, aber wenn password ein String ist, übergibst Du ja nur ein Zeichen, wenn Du password[0] durchreichst.
    DecryptVariable erwartet aber einen pointer auf char (string). Warum das überhaupt compiliert, wundert mich.

    @edit: Bin heute wohl zu langsam und zu schlampig 🙄 ... Ja, und klar, auf Literale schreiben geht schief.



  • pointercrash() schrieb:

    Kannst es gerne noch ein paar mal umbenennen, aber wenn password ein String ist, übergibst Du ja nur ein Zeichen, wenn Du password[0] durchreichst.

    Ich fürchte, an der Stelle hast du nicht genau genug hingesehen: password ist ein Zeiger-Array, das heißt password[0] ist ein char-Zeiger (der allerdings auf ein String-Literal, d.h. ein const char[] verweist - das ist in C leider erlaubt, auch wenn die meisten Compiler davor warnen sollten).



  • Ok danke für die hilfreichen Antworten.
    Wie kann ich das jetzt aber am besten machen?
    Bin leider noch nicht so recht fit was C angeht.



  • Ich sagte ja, ich war zu langsam und zu schlampig, Asche auf mein Haupt! 🙄



  • BI0S schrieb:

    Ok danke für die hilfreichen Antworten.
    Wie kann ich das jetzt aber am besten machen?

    Wie ich schon sagte, nimm ein char-Array - dort darfst du nach Belieben lesen oder schreiben:

    char password[][10] = {"546572","5657256"};
    

    (ich hoffe, ich hab' die Reihenfolge der Indizes richtig hinbekommen)



  • BI0S schrieb:

    Ok danke für die hilfreichen Antworten.
    Wie kann ich das jetzt aber am besten machen?
    Bin leider noch nicht so recht fit was C angeht.

    Mach' einfach weiter, wir helfen Dir gerne, wenn Du mal hängst.
    Mini- Tip:
    Warum bestimmst Du die Stringlänge extern und übergibst zwei Parameter?
    Laß' die Funktion nur auf dem String werkeln, wenn es keinen Grund dafür gibt.
    Nächstes Problem wird sein, daß Du buf nach außen reichen willst. Das gibt Schwierigkeiten, weil buf au0erhalb der Funktion nicht existiert. Mögliche Alternative: buf als Referenz reingeben.
    Dann wird

    DecryptVariable(char *instr, char *outstr)
    

    fast lib- mäßig.
    Du legst buf in der main an und gibst sie als &buf beim Aufruf mit. Die Länge prüfst Du besser intern.

    Einfach mal machen ... 😉



  • Ok wenn ich also so ein mehrdimensionales Array benutze wie kann ich dann in ner Funtkion darauf zugreifen?
    Also auf das mehrdimensionale char Array?
    Wie müsste der Funktion aufruf sein damit die Werte übergeben werden?



  • void funktion(char (*array)[10],size_t anzahl)
    {
      while( anzahl-- )
        puts(array[anzahl]);
    }
    
    int main()
    {
      char password[][10] = {"546572","5657256"};
      funktion(password,sizeof password/sizeof*password);
      return 0;
    }
    

    Wichtig ist dass du begreifst, dass der Compiler für diese Art der Übergabe eines mehrdimensionalen Arrays als Funktionsparameter alle Dimensionsangaben/Größen ab der 2. Dimension benötigt.
    Das sollte bei einigem Nachdenken über z.B. ein zweidimensionales Array klar sein (und auch in diversen "Fach"büchern und von diversen Lehrern eigentlich gelehrt werden, tut es aber oft nicht).


Log in to reply