Länge eines dyn.Sp. berechnen. Wie?



  • wenn ich

    char* ptr=(char*)malloc(sizeof(char)*150);
    memset(ptr, 1, 150);
    

    tue, wie kann ich im Nachhinein feststellen wie groß der allokierte Speicher ist?

    wenn ptr ein ptr[] wäre, könnte ich ja mit sizeof(ptr) die gesamtgröße des Arrays ermitteln. Aber wie mache ich das bei dem zeiger. Da würde er mir 4Byte für den Zeiger auf das erste char ausgeben.



  • wie kann ich im Nachhinein feststellen wie groß der allokierte Speicher ist?

    Garnicht. Möglicherweise gibt es irgendeinen schmutzigen Hack, um an die Verwaltungsdaten des Heapmanagements heranzukommen, aber das wäre dann Compiler/Plattformabhängig und überhaupt böse...

    Grüße

    Martin



  • d.h. ich muss dem Benutzer sagen dass er in dem Fall für den Speicherplatz nicht mehr als 150Byte verwenden darf. Tut er es trotzdem kommt eine Fehlermeldung oder?
    (Debug Assertion oder so ähnlich)



  • Nein, es kommt nicht zwangsweise eine Fehlermeldung. In C wird nicht
    überprüft, ob der Speicherzugriff erlaubt ist.

    Solche Fehler sind oft der Grund für lange Debugsessions, weil sie sich
    i.d.R. bei ganz anderen Stellen bemerkbar machen.

    Unter Zuhilfenahme von valgrind kann man aber solchen Fehlern auf die
    Spur kommen.

    Gruß mcr



  • Stimmt, er überschreibt einfach den rest ohne zu mäckern:

    int main(void)
    {
        char* ptr = (char*)malloc(sizeof(char)*4);
        strcpy(ptr, "Hallo");
        printf("%s", ptr);
        return(0);
    }
    

    Danke für den Tip mit valgrind. Wenn es wirklich hilft solche leichtsinnsfehler zu vermeiden spart es ne menge zeit die für fehlersuche verschwendet wird



  • JDHawk schrieb:

    Stimmt, er überschreibt einfach den rest ohne zu mäckern:

    int main(void)
    {
        char* ptr = (char*)malloc(sizeof(char)*4);
        strcpy(ptr, "Hallo");
        printf("%s", ptr);
        free(ptr);
        ptr=NULL;
        return(0);
    }
    

    Danke für den Tip mit valgrind. Wenn es wirklich hilft solche leichtsinnsfehler zu vermeiden spart es ne menge zeit die für fehlersuche verschwendet wird



  • Ja tut es. Bei uns ist nur das Problem, dass wir teilweise Laufzeiten von
    mehreren Stunden (optimierten Code ohne valgrind) und einen Speicherverbrauch
    von mehreren 10GB haben. Beides quittiert valgrind mit sehr hoher Laufzeit.

    Noch wichtig: Du solltest sämtliche eigene Speicherverwaltung abschalten und
    dafür malloc und free verwenden, damit valgrind alle Fehler finden kann.

    Gruß mcr



  • ne frage zu valgrind:
    das ist nur fürs compilieren von kommandozeile aus verwendbar?
    unter Windows und VS2003 dann mit nmake?

    ok seh gerade nix mit windoof.
    vielleicht steig ich mal auf linux oder cygwin um



  • Valgrind hat nichts mit dem Kompilieren zu tun.

    Du kompilierst normal dein Programm (gcc mit -g, damit die Funktionen
    aufgelöst werden können, und ohne jegliche Optimierung -O?, damit du die
    gefundenen Fehlern besser wiederfinden kannst.) Dann startest du dein
    Programm mit

    valgrind <options> <programmname> <parameter>

    Gruß mcr



  • Falls du noch ein Tool für Visual Studio suchst dann kann ich nur Visual Leak Detector empfehlen.

    schirrmie


Anmelden zum Antworten