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