Problem bei Dynamsicher Speicherverwaltung (Die eingabe bricht ab)



  • Hi,

    Mein Problem ist das bei der Eingabe (New()) es einen fehler gibt ab dem 3. Element und ich habe keine Ahung warum?
    Dazu gesagt bin mit C auch nicht so vertraut kenne nur C# und da habe ich die Sorgen nicht

    Vielen dank
    Schon mal.

    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    #include <afx.h>
    
    // Funktions Prototypen
    void New(void);
    void Show(void);
    
    struct adress
    	{
    	char Nachname[100];
    	char Vorname[100];
    	}*ss,*head;
    
    int nByte = sizeof(adress);
    int AnzEle = 0;
    
    	void main(void)
    	{
    		char eingabe;
    		while(tolower(eingabe) != 'e')
    		{
    			system("cls");
    			printf("\t\tBitte Aktion Wählen\n\n");
    			printf("A = Anzeigen\n");
    			printf("H = Hinzufuegen\n");
    			printf("E = Ende\n");
    			scanf("%s", &eingabe);
    
    			switch(tolower(eingabe))
    			{
    				case 'h' : New();break;
    				case 'a' : Show();break;
    			}
    		}
    	}
    
    	void New(void)
    	{
    
    		if(ss == NULL)
    		{	//AnzEle += 1;
    			ss = (adress*)malloc(1*sizeof(adress));
    			head = ss;
    		}
    		else
    		{	
    			//AnzEle += 1;
    			ss = (adress*)realloc(ss,(sizeof(adress)*AnzEle));
    			head = ss;
    			ss = (adress*) (ss->Nachname+(sizeof(adress)*AnzEle-1));
    
    		}
    	AnzEle += 1;
    
    	printf("\nBitte geben Sie ein Vornamen ein\t");
    	//scanf("%s",(adress*)(ss->Vorname+(nByte*(AnzEle))));	//MIST?
    	scanf("%s",ss->Vorname);
    
    	printf("\nBitte geben Sie ein Nachnamen ein\t");
    	scanf("%s",ss->Nachname);
    	//scanf("%s",(adress*)(ss->Nachname+(nByte*(AnzEle))));	// MIST??
    
    	}
    	void Show(void)
    	{
    	struct adress *TEMP;
    	TEMP = head;
    		for(int i = 0;i<AnzEle;i++)
    		{
    
    			printf("\n\n");
    		//	printf("Vorname:\t%s\n",  (adress*)head->Vorname+(nByte*(i)));	// MIST
    		//	printf("Nachname:\t%s\n",  (adress*)head->Nachname+(nByte*(i))); // MIST
    			printf("Nachname:\t%s\n",  head->Nachname);
    			printf("Nachname:\t%s\n",  head->Vorname);
    			printf("\n\n");
    			printf("\n%i %i\n", AnzEle, i);
    			head = (adress*)(head->Nachname+sizeof(adress)-1);	// MINUS EIN BYTE, SONST WIRD DER ERSTE
    																// BUCHSTABE ABGESCHNITTEN;?????
    		}
    		head = TEMP;
    
    		fflush(stdin);
    		getchar();
    	}
    


  • abgesehen davon, dass conio.h nicht ANSI ist und die main Funktion int sein soll .... was für ne Fehlermeldung bekommst du? Segmentation Fault?



  • mh, wie gesagt C ist nicht ganz so mein ding.
    Da poppt bei mir ne Message (Vom Visual Studio C++)
    Die wirklichen in Formation sind daraus

    "Debug Assertion Failed"
    "Expression : _CrtIsValidHeapPointer(pUserdate)"

    Das erste speicher element wird so allokiert

    if(ss == NULL)
    		{	//AnzEle += 1;
    			ss = (adress*)malloc(1*sizeof(adress));
    			head = ss;
    		}
    

    das geht auch so!

    2. 3. 4. usw soll so allkoiert werden

    else
    		{	
    			//AnzEle += 1;
    			ss = (adress*)realloc(ss,(sizeof(adress)*AnzEle));
    			head = ss;
    			ss = (adress*) (ss->Nachname+(sizeof(adress)*AnzEle-1));
    
    		}
    

    und beim 2 geht es auch noch, erst beim dritten gibt es halt den fehler
    Und genau hier wenn ich den "Speicher Weiterschalten will"

    ss = (adress*) (ss->Nachname+(sizeof(adress)*AnzEle-1));
    

    Aber warum?



  • Du erhöhst die Anzahl der Elemente auch meiner Meinung falsch.

    else
            {    
                AnzEle += 1; /* sollte hier stattfinden */
                ss = (adress*)realloc(ss,(sizeof(adress)*AnzEle));
                head = ss;
                ss = (adress*) (ss->Nachname+(sizeof(adress)*AnzEle-1));
    
            }
    


  • Bei diesem Konstrukt

    ss = (adress*) (ss->Nachname+(sizeof(adress)*AnzEle-1));

    wurdert es mich nicht sonderlich, dass da ein Fehler auftaucht.

    • Mach dein malloc() und realloc() mal nur mit head und ändere head nicht!
    • Nach dem malloc() (auf head ;)) setzt du ss auf head (also ss = head).
    • Erhöhe AnzEle bevor du den realloc() machst (Am einfachsten vor dem if() anstatt danach ;))
    • Nach dem realloc() erhöhst du ss einfach nur (++ss); der Compiler weiß alleine wie groß adress ist 😉

Anmelden zum Antworten