Dynamische Speicherung von Strings -> Fehler nach der dritten Ausführung



  • .hhh



  • Grausamer Code.
    Grausam lesbarer Code.
    Hast du schon mal was von strcpy gehört, strlen kennst du ja immerhin.
    Mind. 1 Fehler ist schon mal, dass du in

    struktur.ordnerspeicher = (char **)malloc(struktur.ordnerzaehler * sizeof(char *));
    

    Platz für struktur.ordnerzaehler Elemente schaffst um danach darüber hinaus zuzugreifen.
    Werfe den ganzen Kommentarkram inkl. der malloc-Cast/Fehlerbehandlung mal raus, verwende cpp-Tags und dann wirst du schon alleine von der Übersichtlichkeit her Fehler eher finden.



  • Ich hab' den Code jetzt nur überflogen, aber die malloc()-Anweisungen sehen merkwürdig aus. Was hat denn das "+1*sizeof(char*)" am Ende zu bedeuten? Außerdem liefert dir malloc() nicht-initialisierten Speicher, das macht es keinen Sinn, per strlen() die Länge des Speichers zu ermitteln - und du überschreibst vermutlich Bereiche, in denen malloc()/free() seine Verwaltungs-Informationen unterbringt.



  • @ Wutz
    Stimmt allerdings, hab ich auf die schnelle geschrieben.
    Danke stimmt, ich werde strcpy verwenden.. ist ja auch einfacher 🙂
    Ok, Ich werde dann einmal meinen Code ausbessern.
    Was sind cpp-Tags?

    @CStoll
    Was hat denn das "+1*sizeof(char*)" am Ende zu bedeuten?

    Ein String hat ja am ende ein /0 oder? Muss ich dafür nicht extra ein byte reservieren?



  • xcatpc schrieb:

    Was sind cpp-Tags?

    Du hast den Code-Button gedrückt und damit code-Tags benutzt.
    Drück den C/C++ Button daneben; dann gibts den Code in Farbe und bunt.

    xcatpc schrieb:

    Ein String hat ja am ende ein /0 oder? Muss ich dafür nicht extra ein byte reservieren?

    Du reservierst aber Speicher für char**.
    Das sind bei den meisten Systemen z.Zt. 4-8 Byte. Ein char hat (meistens) ein Byte.
    Bringst du evtl. char, char* und char** durcheinander?

    Außerdem gilt immer noch Punkt vor Strich-Rechnung.



  • xcatpc schrieb:

    Was sind cpp-Tags?

    Wenn du deine Quelltexte nicht mit [code] eröffnest, sondern mit [cpp], bekommst du genauso schöne Formatierungen und zusätzlich noch Syntax-Highlighting von C- oder C++-Codes.

    @CStoll
    Was hat denn das "+1*sizeof(char*)" am Ende zu bedeuten?

    Ein String hat ja am ende ein /0 oder? Muss ich dafür nicht extra ein byte reservieren?

    Ja, dafür würde ein "+1" ausreichen - das sizeof() ist an dieser Stelle sinnlos.



  • 😮 null



  • xcatpc schrieb:

    Das einzige Problem das ich noch habe, ist dass es eine Fehlermeldung gibt, sobald ich folgende Zeile auskommentiere: //free(struktur.ordnerspeicher);

    Und wie heißt diese Fehlermeldung? 😡



  • Die selbe Fehlermeldung wie oben



  • worauf ist diese Fehlermeldung zurückzuführen? Kann mi jemand diesen Fehler erklären?



  • In der Tat ein schwer nachvollziehbarer Code. Ich mag ihn nicht analysieren und nach dem Fehler suchen.

    Das sollte aber mit den Bordmitteln von C doch sehr viel einfacher gehen ohne jede dynamische Speicherung der Strings. Man überschreibt sie einfach oder kopiert sie mit strcpy woanders hin, wenn sie noch gebraucht werden. Wie gross sind denn die Strings?

    Allgemeiner Hinweis: Bitte stets klar sagen, was man genau vor hat und nicht nur den möglicherweise komplizierten Lösungsweg mit Fehlermeldung darstellen!



  • berniebutt schrieb:

    In der Tat ein schwer nachvollziehbarer Code. Ich mag ihn nicht analysieren und nach dem Fehler suchen.

    Das sollte aber mit den Bordmitteln von C doch sehr viel einfacher gehen ohne jede dynamische Speicherung der Strings. Man überschreibt sie einfach oder kopiert sie mit strcpy woanders hin, wenn sie noch gebraucht werden. Wie gross sind denn die Strings?

    Allgemeiner Hinweis: Bitte stets klar sagen, was man genau vor hat und nicht nur den möglicherweise komplizierten Lösungsweg mit Fehlermeldung darstellen!

    Ich halte mich an meinen zweiten Quellcode Beitrag hier.
    Der Sinn des Programmes ist, das bei jedem aufruf der Funktion einlagern, der Parameter der übergeben wird. Also ein Name eines Ordners. Gesichert wird. Da auch Ordner ausgelesen werden, können hier wie bei einer starken Verwurzelungen sehr viele Ordner vorhanden sein.

    Ich hätte es auch wahrscheinlich mich realloc lösen können. Aber irgendwie Interessiert es mich das Problem so zu lösen.

    Als erstes alloziert das Programm Speicher für die erste eingabe.
    Nach jedem folgenden Aufruf, wird zuerst ein Temponäres dynamisches Array erstellt um den derzeitigen Inhalt + den aktuellen Dateinamen temponär abzuspeichern. Danach wird der struktur.ordnerspeicher freigeben, neu alloziert und alles hineinkopiert.

    Bis jetzt habe ich jedoch noch keine Lösung für den Fehler. Merkwürdigerweise verschwindet er, wenn ich die Zeilte freigebe, an der der Speicher für struktur.ordnerspeicher freigegen wird.

    hmm.. Vielleicht komm ich noch drauf 🙂



  • Ich würde mal vermuten, du hast immer noch irgendwo die Array-Grenzen überschritten.

    Auf Anhieb sehe ich nur, daß du nirgends etwas in struktur.ordnerzaehler reinschreibst und daß die sizeof()-Angaben in den malloc() nicht so ganz passen. Eventuell solltest du dir auch mal realloc() ansehen.



  • Du greifst in deinem Code

    struktur.ordnerspeicher[x]
    

    immer noch auf undefinierten Speicherbereich zu; liest du eigentlich die Hinweise oder sagst du nur, dass du sie liest und tust es dann (offensichtlich) nicht?



  • Wutz schrieb:

    Du greifst in deinem Code

    struktur.ordnerspeicher[x]
    

    immer noch auf undefinierten Speicherbereich zu; liest du eigentlich die Hinweise oder sagst du nur, dass du sie liest und tust es dann (offensichtlich) nicht?

    Tut mir leid, aber ich kann den Zugriff auf den undefinierten Speicherbereich nicht finden. Entweder bin ich blind oder doof!
    Welche Zeile meinst du genau?

    @CStoll

    Der Ordnerzaehler wird außerhalb der Funktion erhöht, bevor diese aufgerufen wird. (Steht nicht im Quellcode den ich gepostet habe!)

    Das komische ist wie gesagt das, dass Programm funktioniert (sogar mit über 5000 Einträgen) allerdings bekomme ich die schon gepostete Fehlermeldung wenn ich den Speicher für struktur.ordnerspeicher freigebe. Ich schätze das es nur ein kleiner Fehler ist..



  • jjj



  • Du machst dir definitiv zu viel Arbeit, um die Daten umzukopieren - reservier dir lieber einmal genug Speicher und fülle ihn dann (wieviele Einträge du hast, weißt du in diesem Fall ja). Wenn du zur Laufzeit noch Einträge hinzufügen willst, nimm lieber man: realloc().

    PS: Globale Variablen sind unbeliebt und die sizeof()-Ergänzungen bei deinen Speicheranforderungen sind immer noch fehlerhaft.

    PPS: Zeile 78 bis 93.



  • CStoll schrieb:

    Du machst dir definitiv zu viel Arbeit, um die Daten umzukopieren - reservier dir lieber einmal genug Speicher und fülle ihn dann (wieviele Einträge du hast, weißt du in diesem Fall ja). Wenn du zur Laufzeit noch Einträge hinzufügen willst, nimm lieber man: realloc().

    PS: Globale Variablen sind unbeliebt und die sizeof()-Ergänzungen bei deinen Speicheranforderungen sind immer noch fehlerhaft.

    PPS: Zeile 78 bis 93.

    Ich denke auch, das es das beste ist wenn ich den kompletten Code neu schreibe.

    Zeile 78

    struktur.ordnerspeicher = (char **)malloc(struktur.ordnerzaehler * sizeof(char **));
    

    wie muss die Zeile aussehen?
    Tut mir leid wenn ich so triviale Fragen habe, aber ich steht momentan total auf dem Schlauch. Ich habe vorhin einfach sizeof weggelassen und stattdessen eine 1 geschrieben, worauf eine Fehlermeldung folgte.

    PS: Ich hoffe ich bin euch nicht zu anstrengend, ich möchte nur genau verstehen was ich falsch mache.



  • xcatpc schrieb:

    Zeile 78

    struktur.ordnerspeicher = (char **)malloc(struktur.ordnerzaehler * sizeof(char **));
    

    wie muss die Zeile aussehen?
    Tut mir leid wenn ich so triviale Fragen habe, aber ich steht momentan total auf dem Schlauch. Ich habe vorhin einfach sizeof weggelassen und stattdessen eine 1 geschrieben, worauf eine Fehlermeldung folgte.

    Dort ist am Ende ein Stern zu viel (aber das ist nicht so kritisch, weil Zeiger normalerweise einheitliche Größe haben). Aber vergleich mal die Größe mit den Grenzen der nachfolgenden Schleife(n).

    (die sizeof(char*)-Angaben beim Speicher-Reservieren für die einzelnen Array-Elemente sind überflüssig (allerdings abgesehen von der Speicher-Verschwendung ungefährlich))



  • OK.. Danke vorerst

    Ich werde mal weiter basteln und bei Ergebnissen wieder posten.


Log in to reply