dynamischer speicher - fehlermeldung

  • Hallo!

    Ich hab nochmal ein Problem mit dem dynamischen speicher!!

    Ich hab jetzt mein programm frtig und es funktioniert auch
    nur nachdem das programm alles getan hat was es tun soll (brav brva *gg*)
    kommt die fehlermeldung: "Segmentation fault"

    Und ich bin draufgekommen wieso

    weil am ende des programms hab ich
    free(feld)
    feld = NULL;
    free(hilfsfeld)
    hilsfeld = NULL;

    stehen...
    Da smuss ich ja (also den speicherplatz wieder freigeben)
    Wenn ich den nämlich weglas kommt die fehlermeldung nicht, aber ich kann das ja nicht einfach weglassen oder?!

  • erm


    mit free gibst du den speicher frei den du vorher alloziiert hast, wenn du nun in der darauf folgenden anweisung versuchst einen wert zuzuweisen wirst du dabei natuerlich nen segfault bekommen.

    so seh ich das zu mindest.

    einfach die reihenfolge aendern.

    david

    I like Toast!

  • Zitat von Stellina

    free(feld)
    feld = NULL;
    free(hilfsfeld)
    hilsfeld = NULL;


    Das kann so schon stimmen, aber es kommt halt aufs restliche Programm an. Poste am besten ein vollständiges, aber möglichst kurzes Programm, das dieses Problem demonstriert.
    Hast du sicher sowohl feld als auch hilfsfeld mit malloc o.ä. angelegt? Hast du Pointerarithmetik betrieben?

    *plantsch*

  • ja aber ich hab das ja schon ganz unten stehen!

    also ganz am ende vom programm
    darunter steht dann nur noch return 0;

    das programm tut ja auch alles was es tun muss, nur halt, dass dann wenn es fertig is diese fehlermeldung ausspuckt...

  • okay also das ist das programm: (den algorithmus zum sortieren hab ich mal weggelassn der ist dafür denk ich eh mal unrelevant...)
    main()
    {


    // Deklarieren der Variablen
    int anzahl;
    int i;
    int j;
    char eingabe;
    double elemente;
    double* feld = malloc(anzahl*sizeof(double));
    double* hilfsfeld = malloc(anzahl*sizeof(double));

    printf("\nDieses Programm sortiert die Elemente eines Feldes in aufsteigender bzw. \n absteigender Reihenfolge.\n\n");

    // Eingabe der Elemente
    printf("\nGeben Sie die zu sortierenden Elemente - durch Leerzeichen getrennt - ein. \n (Eingabe bitte mit Entertaste beenden!) \n\n");

    // do-while Schleife, weil solange Elemente eingegeben werden, bis die Entertaste gedrueckt wird
    do
    {
    scanf("%lf", &elemente);
    // Das Feld wird vergroessert, damit die naechste Zahl eingelesen werden kann
    feld = realloc(feld, (anzahl+1)*sizeof(double));

    feld[anzahl] = elemente;
    anzahl++;
    }
    while (getchar() != '\n');


    // Auswahl, ob die Sortierung in aufsteigender Reihenfolge erfolgen soll
    printf("\n\nWollen Sie die Elemente aufsteigend sortieren? (j/n) ");
    scanf("%s", &eingabe);

    if (eingabe == 'j')
    {
    // Funktionsaufruf
    mergesort(feld, hilfsfeld, 0, anzahl-1);

    // Ausgabe des sortierten Feldes
    printf("\nDas sortierte Feld: \n");
    for (i=0; i < anzahl; i++)
    {
    printf("\n%lf \n", feld[i]);
    }

    printf("\n");
    }
    else
    {
    if (eingabe == 'n')
    {
    // Funktionsaufruf
    mergesort(feld, hilfsfeld, 0, anzahl-1);

    // Ausgabe des sortierten Feldes (in umgekehrter Reihenfolge)
    printf("\nDas sortierte Feld: \n");
    for (i = anzahl-1; i >= 0; i--)
    {
    printf("\n%lf \n", feld[i]);
    }
    printf("\n");
    }
    }

    // reservierten Speicherplatz freigeben
    free(feld);
    feld = NULL;
    free(hilfsfeld);
    hilfsfeld = NULL;

  • Das ist schon bissi besser:

    *plantsch*

  • 1. Kann man erwarten, dass der Pointer, der bei malloc(0) herauskommt (wahrscheinlich NULL) dann ein gültiges Argument für realloc() ist?

    2. Mit dem scanf("%s", &eingabe) überschreibst du Speicher, wo du nicht sollst.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!