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

    person  *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 20

    und 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


Log in to reply