zeiger auf Malloc hilfe
-
Ich möchte die Adressen abspeichern und da ich nich weiß wieviele Dateien ich abspeicher will ich nicht #Define benutzen und mit malloc speicher freigeben. (Mit #Define MAX_ADRESSEN [20] fuktioniert es aber nicht mit einem *zeiger) Bin noch anfänger darum tut es mir leid wenn es unübersichtlich aussieht.
#include <stdio.h> #include <stdlib.h> #include <string.h> #define AE (unsigned char)142 // umlaute #define ae (unsigned char)132 #define OE (unsigned char)153 #define oe (unsigned char)148 #define UE (unsigned char)154 #define ue (unsigned char)129 // #define MAX_ADRESSEN 20 // definiert die maximale anzahl der zu speichernden #define MAX_MENUE 9 // Adressen und Menü`s int lese_aktion (void); void eingabe (int); void ausgabe (int); void zeige_menue (void); int lese_datei (void); void schreibe_datei (int); void loesche_datei (void); char *dyn_speicher (void); char *dyn_speicher2 (void); char pAdressen1 [20]; char *Anzahl; /*int max_anders (void); char puffer[MAX_ADRESSEN]; char *dyn_string;*/ struct person // Deklaration der Struktur "person" { char nachname[20]; // Elemente von "person" char vorname[20]; int plz; char ort[20]; }; //struct person adressen [MAX_ADRESSEN]; // Definition der Variable "adressen" struct person *pAdressen1; char *kartei = "d:\\ADRESSEN.KRT"; main() { int anzahl = 0; int aktion; do { zeige_menue(); aktion = lese_aktion(); if (anzahl >= pAdressen1) { Anzahl = (char*) realloc(Anzahl, pAdressen1 +5); if (Anzahl == NULL) { printf("Error, out of memory"); return NULL; } switch (aktion) { case 1: if (anzahl < *pAdressen1) eingabe (anzahl++); else printf("Die maximale Anzahl der ", "Adressen ist erreicht.\n"); break; case 2: ausgabe (anzahl); break; case 3: anzahl = lese_datei(); break; case 4: schreibe_datei (anzahl); break; case 5: loesche_datei (); break; case 6: dyn_speicher (); break; case 7: dyn_speicher2 (); break; // case 8: max_anders (); // break; case 9: exit(0); default: printf ("Ung%cltiger Men%cpunkt.\n",ue,ue); } } while (aktion !=9); // läuft solange bis die aktion 6 aufgerufen wurde } //free (Anzahl); int lese_aktion (void) // einlesen der Menüauswahl { int aktion; printf("Bitte w%chlen Sie einen Men%cpunkt: ",ae,ue); scanf ("%d", &aktion); return (aktion); } void eingabe (int) // eingabe der "adressen" { printf("Vorname: "); scanf("%s", pAdressen1-> vorname); printf("Nachname: "); scanf("%c", *pAdressen1 ->nachname); printf("Postleitzahl: "); scanf("%c", &pAdressen1 ->plz); printf("Ort: "); scanf("%c", pAdressen1 ->ort); return; } void ausgabe (int anzahl) // ausgabe der "adressen" { int zaehler; for (zaehler = 0; zaehler < anzahl; zaehler++) printf ("%s, %s, %d %s \n", pAdressen1 ->nachname, pAdressen1 ->vorname, &pAdressen1 ->plz, pAdressen1 ->ort); return; } void zeige_menue(void) // ausgabe vom Menü { printf("\n\t1\tAdresse eingeben\n"); printf("\t2\tAdresse ausgeben\n"); printf("\t3\tDatei lesen\n"); printf("\t4\tDatei sichern\n\n"); printf("\t5\tDatei l%cschen\n\n",oe); printf("\t6\tDyns1\n"); printf("\t7\tDyns2\n\n"); printf("\t8\tMax anders\n\n"); printf("\t9\tEnde\n"); return; } int lese_datei (void) // einlesen der gespeicherten Datei { FILE *dz; int ergebnis = 0; int anzahl = 0; if ( (dz=fopen(kartei,"r")) != NULL) { fread (&Anzahl, sizeof (int), 1, dz); ergebnis = fread (&pAdressen, sizeof (int), pAdressen, dz); // fread zum lesen der Datei fclose (dz); } else printf ("\nFehler beim %cffnen der Datei.",OE); return (ergebnis); } void schreibe_datei(int anzahl) // zum Speichern der Datei { FILE *dz; if ( (dz = fopen (kartei, "w")) != NULL) { fwrite (&anzahl, sizeof (int), 1, dz); fwrite (&pAdressen, sizeof (int), pAdressen, dz); // fwrite zum Speichern fclose (dz); } else printf("\nFehler beim %cffnen der Datei.",OE); return; } void loesche_datei (void) // Löschen der Datei { if( remove( "d:\\ADRESSEN.KRT" ) != 0 ) // remove zum löschen puts( "Fehler, Datei kann nicht gel\x94scht werden"); else puts( "Datei erfolgreich gel\x94scht"); return; }
-
Reduzier mal bitte den Quellcode auf das Minimum was notwendig ist, um dein Problem zu beschreiben und dann beschreibe mal zusätzlich mit Text systematisch dein Problem.
Was genau willst du machen, wie hast du es versucht und wo gab es genau Probleme.
Das aktuelle Chaos wird vermutlich niemand mal eben so schnell überblicken
-
also, das programm soll adressen die ich eingebe mit
void eingabe (int) // eingabe der "adressen" { printf("Vorname: "); scanf("%s", pAdressen1-> vorname); printf("Nachname: "); scanf("%c", *pAdressen1 ->nachname); printf("Postleitzahl: "); scanf("%c", &pAdressen1 ->plz); printf("Ort: "); scanf("%c", pAdressen1 ->ort); return; }
über
struct person // Deklaration der Struktur "person" { char nachname[20]; // Elemente von "person" char vorname[20]; int plz; char ort[20]; }; //struct person adressen [MAX_ADRESSEN]; // Definition der Variable "adressen" struct person *pAdressen1;
in
char *kartei = "d:\\ADRESSEN.KRT";
speichern...
dafür hatte ich vorher (wie in meinen kommentaren) mit #define MAX_ADRESSEN [20] den Speicher vorgeschrieben, nun will ich aber mit hilfe von malloc den Speicher automatisch erweitern lassen, aber es funktioniert nicht... weiß nicht was ich falsch mache
-
Also du willst quasi Stück für Stück dein Array vergrößern, damit du eine weitere Adresse drin speichern kannst?
Die Erweiterung von Speicher geht mit "realloc":
http://pubs.opengroup.org/onlinepubs/007908799/xsh/realloc.htmlperson *array = NULL; int aktgroese = 0; // erweiterung ++aktgroese; array = realloc( array, aktgroese * sizeof( person ) ); // jetzt ist das array groesser und kann befuellt werden z.B. strcpy( array[ aktgroese - 1 ].vorname, "meinvorname" );
Ich hab das jetzt nur mal schnell zusammen geklöppelt. Ich hoffe das funzt
-
Du vergleichst char* mit int und struct person*
realloc musst du beim ersten Anfordern auch einen Zeiger auf NULL übergeben.
Zudem berechnest du die Speichergröße falsch.
-
ich weiß, aber ich hab schon alles versucht, guckt mal hier:
char pAdressen1 [20]; char *Anzahl; /*int max_anders (void); char puffer[MAX_ADRESSEN]; char *dyn_string;*/ struct person // Deklaration der Struktur "person" { char nachname[20]; // Elemente von "person" char vorname[20]; int plz; char ort[20]; }; //struct person adressen [MAX_ADRESSEN]; // Definition der Variable "adressen" struct person *pAdressen1 = NULL; char *kartei = "d:\\ADRESSEN.KRT"; main() { int anzahl = 0; int aktion; do { zeige_menue(); aktion = lese_aktion(); { switch (aktion) { case 1: if (anzahl >= *pAdressen1) &pAdressen1 = (char*) realloc(pAdressen1, *Anzahl +5); eingabe (anzahl++); if (Anzahl == NULL) { printf("Error, out of memory"); return NULL; }
ich bin so verwirrt, hoffe mir kann einer nu erklären was ich anders machen muss... ich will ja die größe ändern von der anzahl der eingegebenen adressen
z.B nachname 1
vorname 1
plz 1
ort 1
.
.
.
nachname 20
vorname 20
plz 20
ort 20und nu kommt 21 aber dann ist ja speicher normal voll da ich #define ... [20] hatte aber wenn ich jetzt mir realloc es machen will geht das i.wie nicht...
-
if (anzahl >= *pAdressen1)
Das macht gar keinen Sinn.
*pAdressen ist das erste Element im Array. warum du das mit Anzahl vergleichen willst, ist mir nicht klar.
Warum willst du eigentlich das ergebnis von "realloc" immer in char* casten? caste das doch mal in (person*)...
-
Kommst du denn nicht selber bei anzahl und Anzahl durcheinander.
Fang noch mal an. Du kannst ja erstmal mit
struct person adressen [MAX_ADRESSEN]; struct person *pAdressen = adressen;
anfangen und nur mit pAdressen arbeiten.
Wenn das klappt kannst du dich an malloc/realloc ran machen.
Der Speicherplatz für realloc berechnet sich übrigens mit sizeof(struct person) * Anzahl_der_Eintraege