1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

dynamischer speicher - fehlermeldung

  • Stellina
  • 23. Dezember 2004 um 18:00
  • Unerledigt
  • Stellina
    3
    Stellina
    Mitglied
    Punkte
    70
    Beiträge
    10
    • 23. Dezember 2004 um 18:00
    • #1

    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?!

  • davewood
    17
    davewood
    Mitglied
    Reaktionen
    9
    Punkte
    3.204
    Beiträge
    536
    • 23. Dezember 2004 um 18:12
    • #2

    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!

  • Plantschkuh!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    Punkte
    6.173
    Beiträge
    1.181
    • 23. Dezember 2004 um 18:21
    • #3
    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*

  • Stellina
    3
    Stellina
    Mitglied
    Punkte
    70
    Beiträge
    10
    • 23. Dezember 2004 um 18:21
    • #4

    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...

  • Stellina
    3
    Stellina
    Mitglied
    Punkte
    70
    Beiträge
    10
    • 23. Dezember 2004 um 18:23
    • #5

    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;

  • Stellina
    3
    Stellina
    Mitglied
    Punkte
    70
    Beiträge
    10
    • 23. Dezember 2004 um 18:24
    • #6

    ups das return 0;

    und die eine eckige klammer hab ich jetzt vergessen rüberzukopieren...

  • Plantschkuh!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    Punkte
    6.173
    Beiträge
    1.181
    • 23. Dezember 2004 um 18:55
    • #7

    Das ist schon bissi besser:

    C
    /* Header sind nicht nur schmückendes Beiwerk */
    #include <stdio.h>
    #include <stdlib.h>
    
    
    void mergesort(double *a, double *b, int c, int d)
    {
        /* Dummy-Implementierung, da manche Leute das Wort "vollständig"
         * anscheinend nicht so verstehen wie ich. Aber hey, ich debugge
         * gerne unbezahlt Programme, die man mir nicht zeigt... */
        (void) a; (void) b; (void) c; (void) d;
    }
    
    
    /* Prototypes sind auch sehr nett. */
    int main (void)
    {
        /* Deklarieren der Variablen */
        /* anzahl muß vor der Verwendung initialisiert werden! Bei mir
         * hat die Änderung dieser Zeile die segfaults abgeschafft. Wenn
         * der Compiler nicht wegen nicht initialisierten Variablen
         * schimpft, Optimierung einschalten. Das aktiviert meistens
         * auch die entsprechenden Analysen im Compiler. */
        int anzahl = 0;
        int i;
        char eingabe;
        double elemente;
        /* Auf NULL testen! */
        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
        {
            /* double heißt bei scanf "%lf", bei printf "%f" */
            scanf ("%lf", &elemente);
            /* Das Feld wird vergroessert, damit die naechste Zahl
             * eingelesen werden kann */
            /* Auf NULL testen! */
            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) ");
        /* Lieber fgets verwenden. */
        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%f\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%f\n", feld[i]);
                }
                printf ("\n");
            }
        }
    
    
        /* reservierten Speicherplatz freigeben */
        free (feld);
        feld = NULL;
        free (hilfsfeld);
        hilfsfeld = NULL;
        return 0;
    }
    Alles anzeigen

    *plantsch*

  • Ringding
    11
    Ringding
    Mitglied
    Reaktionen
    12
    Punkte
    1.237
    Beiträge
    244
    • 24. Dezember 2004 um 10:54
    • #8

    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.

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung