absturz



  • folgendes programm stürzt immer ab und ich versteh nicht warum. wenn ich den wert der zurückgegeben werden soll in der funktion ausgeben und die funktion nix ausgibt dann klappt es nur wenn ich halt das zurückgeben will stürzt es ab.

    char* test(char* enc_string, int key)
     {
       int i, crypted;   
       char* dec_string;
       for(i=0;i<strlen(enc_string);i++)
         {
           crypted = enc_string[i]+key;
           dec_string[i] = (char) crypted;                 
         }  
       return(dec_string);    
     }
    
    int main()
     {
       printf("%s",test("ab",3)); 
    
    getchar();
    return(0);
    }
    


  • hi..

    ganz einfach.
    dec_string zeigt auf keinen gültigen speicherbereich...

    char* test(char* enc_string, int key) 
     { 
       int i, crypted;
       int len = strlen(enc_string);   
       char* dec_string = (char *)malloc(len + 1); //speicher bereitstellen
       for(i=0;i<len;i++) 
         { 
           crypted = enc_string[i]+key; 
           dec_string[i] = (char) crypted;                 
         }   
       dec_string[len] = 0; //letztes zeichen muss eine 0 sein
       return(dec_string);     
     } 
    
    char *decstr = test("ab", 3);
    printf("%s",decstr);
    free(decstr); //speicher wieder frei geben
    


  • is das free(...) zwingend erforderlich oder kann man das auch weglassen weil es klappt auch ohne nur weis ich halt nicht welche auswirkungen das hat 😮



  • ja, das free gibt den speicher wieder frei.
    wenn das vergisst, dann hat dein programm ein sog. speicher loch und das ist nicht gut.



  • @esskar
    Speicherlöcher sind wirklich was fieses und haben mir schon des öfteren fast den letzten Nerv geraubt. Klar, zur Laufzeit zusätzlich in Anspruch genommener Speicher muss wieder freigegeben werden.

    Aber FREE()? Sag mir das des ein pures C-Programm ist, und ich versteh dich vollkommen. Aber in Zeiten von C++ und Objekten sollte man sich doch lieber new und delete bedienen.



  • BloodLord schrieb:

    @esskar
    Speicherlöcher sind wirklich was fieses und haben mir schon des öfteren fast den letzten Nerv geraubt. Klar, zur Laufzeit zusätzlich in Anspruch genommener Speicher muss wieder freigegeben werden.

    Aber FREE()? Sag mir das des ein pures C-Programm ist, und ich versteh dich vollkommen. Aber in Zeiten von C++ und Objekten sollte man sich doch lieber new und delete bedienen.

    es kommt immer darauf an, was der jeweilige mensch codet.
    schließlich haben wir auch einen spezial ansi-c bereich in diesem forum.
    und das obige programm sieht nun nach c aus 😉

    viele schüler und studis lernen c pur. thats it .



  • @elisa
    Is klar, C lebt! War mir nicht 100% sicher ob des jetzt C oder C++ sein soll... Und in C++ sollte man halt auf sachen wie alloc() und free() verzichten.



  • 🙂 fast immer.



  • BloodLord schrieb:

    @elisa
    Is klar, C lebt! War mir nicht 100% sicher ob des jetzt C oder C++ sein soll... Und in C++ sollte man halt auf sachen wie alloc() und free() verzichten.

    schon klar...
    für Klassen oder Structs, die wieder KlassenObjecte enthalten, ist new und delete sehr sehr sehr sinnvoll.
    wenn ich aber nur ein char pointer habe und weiß, für was ich es gebrauche, schadet *alloc und free gar nix...
    man muss eben wissen was man wie genau macht



  • @esskar
    Richtig und man sollte wissen, ob man nur C, nur C++ oder beides verwenden will. Wobei man sich am besten für eins von beiden entscheiden sollte.



  • wenn ich aber nur ein char pointer habe und weiß, für was ich es gebrauche, schadet *alloc und free gar nix...

    Ich würde dennoch new/delete nehmen - wieso unterschiedlich? Da kanns dann am Ende auch noch passieren, dass eine Mischung auftritt -> dumme Sache dann.

    MfG SideWinder



  • SideWinder schrieb:

    Da kanns dann am Ende auch noch passieren, dass eine Mischung auftritt -> dumme Sache dann

    ich würde es auch keinem empfehlen, der nicht genau weiß, was er tut.

    ich hatte z.b mal einen memory manager geschrieben, der alle new's und delete's auf alloc's und free's abgebildet hat; alles andere war aber komplett c++.


Anmelden zum Antworten