Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Arbeitsspeicher löschen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
22.01.2005, 13:10 Uhr
~guest2209
Gast


Hallo,

folgende Frage:

Ich erstelle eine Liste, um Adressen ablegen zu können:


C++:
struct ListEl{
    char vorn[80];
    char nachn[80];
    char strasse[80];
    char ort[80];
    char feld[10];
    char postl[80];
    struct ListEl *next;
};




Dafür reserviere auch ein Speicher:


C++:
struct ListEl *neu;

neu = (struct ListEl *) malloc(sizeof(struct ListEl));



In einer anderen Funktion möchte ich später diesen Speicher wieder freigeben!
Dachte dass es mit
C++:
free(neu);

funktioniert. Geht aber nicht, da free einen Zeiger erwartet. Wie kann ich diesen Speicher freigeben. Würde mich freuen, wenn man mir helfen kann !
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.01.2005, 13:38 Uhr
Pablo
Supertux
(Operator)


Doch, so ist es richttig. neu ist bereits ein Zeiger
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.01.2005, 15:42 Uhr
~guest2209
Gast


Funktioniert aber nicht. Ich bekomme den Fehler "Run-Time Check failure #3" the variable neu ist beeing used without defined. Woran kann das liegen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.01.2005, 17:04 Uhr
Pablo
Supertux
(Operator)


Kommt darauf an, wo du free(neu) benutzt. Poste deinen Code.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
22.01.2005, 18:05 Uhr
sedo



Ich bin guest2209!

Soll ich dir meinen kompletten Code an deine email-adresse schicken? Dann hast du vielleicht einen besseren Überblick. Ich bräuchte bis Montag ein funktionsfähiges Programm, und dies mein einziges Problem zurzeit.
Also, wenn du interessiert bis schicke ich dir den kompletten Cde zu, sag bescheid!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
22.01.2005, 18:13 Uhr
Pablo
Supertux
(Operator)


nein, nicht den ganzen Code, sondern nur die Funktion(en), die neu = (struct ListEl *) malloc(sizeof(struct ListEl)); und free(neu) enthalten.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
22.01.2005, 18:22 Uhr
sedo



In dieser Funktion reserviere ich den Speicher und lege Adressen an:


C++:
int adresseAnl (struct ListEl **list)
{
    counter++;
    
    char nachn[80], vorn[80], strasse[80], ort[80], feld[10]={"gueltig"};
    char plz[80];

    printf("Bitte geben Sie einen Nachnamen ein: ");
    scanf("%s", &nachn);
    
    printf("Bitte geben Sie einen Vornamen ein: ");
    scanf("%s", &vorn);

    printf("Bitte geben Sie eine Strasse ein: ");
    scanf("%s", &strasse);

    printf("Bitte geben Sie eine Postleitzahl ein: ");
    scanf("%s", &plz);

    printf("Bitte geben Sie den Ort ein: ");
    scanf("%s", &ort);

  // Neues Listenelement anlegen
  neu = (struct ListEl *) malloc(sizeof(struct ListEl));

  strcpy(neu->nachn,nachn);
  strcpy(neu->vorn, vorn);
  strcpy(neu->strasse, strasse);
  strcpy(neu->postl, plz);
  strcpy(neu->ort, ort);
  strcpy(neu->feld,"gueltig");


  if(*list == NULL ||((stricmp(nachn,(*list)->nachn)) < 0))
  {
      // Einfügen Listenanfang
      neu->next = *list;
      *list = neu;
  }

  else

  {      // Einfügen Listenmitte
      vorg = *list;
      nachf = (*list)->next;

      // Einfügeposition suchen
      while(nachf != NULL && (stricmp(nachf->nachn,nachn)< 0))
      {
          vorg = vorg->next;
          nachf = nachf->next;
      }

      // Einketten
      neu->next = nachf;
      vorg->next = neu;
  }


return 0;
system("cls");
}




Hier speichere ich die Adressen in eine Datei auf der Festplatte:


C++:
int adresseSp(struct ListEl **list, char datei[20])

{    FILE *fp;
        
    fp = fopen(datei,"a");

    fseek(fp,0*sizeof(char),SEEK_SET);
        
    if(fp == NULL)

    {
        printf("Fehler beim Erzeugen der Datei!");
        return 0;
    }
                    
    if (*list == NULL)

        {
         printf("Keine Adressen zum Abspeichern vorhanden!\n\n");
         return 0;
        }
    
    
    if(stricmp((*list)->feld,"falsch"))
        
    {    
        fprintf(fp, "%s",((*list)->nachn));
        fprintf(fp, "\n");
        fprintf(fp, "%s",((*list)->vorn));
        fprintf(fp, "\n");
        fprintf(fp, "%s",((*list)->strasse));
        fprintf(fp, "\n");
        fprintf(fp, "%s",((*list)->postl));
        fprintf(fp, "\n");
        fprintf(fp, "%s",((*list)->ort));
        fprintf(fp, "\n");
        fprintf(fp, "%s",((*list)->feld));
        fprintf(fp, "\n");
        fprintf(fp, "\n");

        
        
        
    }
    
    
    fclose(fp);
    
    if(((*list)->next) != NULL)

    {
        return (adresseSp((&((*list)->next)),datei));
    }
    
    free(neu);
    return 0;
    
}



Nachdem ich alle Adressen gespeicher habe möchte den Arbeitsspeicher leeren, damit ich nicht alle Adressen doppelt habe, wenn ich die Datei öffne.

Wenn ich hier free(neu) hinschreibe, bringt er den Fehler, und kann mir free(neu) nichts anfangen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
22.01.2005, 18:28 Uhr
Spacelord
Hoffnungsloser Fall


Das ist nicht der Sinn eines Forums!
Was Pablo meinte ist dass die Variable neu nicht sichtbar ist für die Funktion die den Speicher wieder freigeben soll.
Übergib deine Zeigervariable als Parameter an die Funktion und alles wird gut...



MfG Spacelord

Bearbeitung:

Da war ich mal wieder zu langsam....


--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.

Dieser Post wurde am 22.01.2005 um 18:30 Uhr von Spacelord editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
22.01.2005, 18:34 Uhr
sedo



Habe getan was du (spacelord) getan hast. Mein Funktionskopf sieht nun so aus:


C++:
int adresseSp(struct ListEl **list, char datei[20], struct ListEl *neu)



Habe aber immernoch das gleiche Problem !
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
22.01.2005, 18:52 Uhr
Pablo
Supertux
(Operator)


Tja,

C++:
int adresseSp(struct ListEl **list, char datei[20]);



hat den Fehler, dass du die Variable neu in dieser Funktion nicht zuweist. Mir ist aber überhaupt nicht klar, was du free-en willst, was du machen willst, denn neu kommt in adresseSp überhaupt nicht vor, ich weiß nicht, was du freigeben willst. Was willst du freigeben und die Frage ist wann.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: