Benutzer mit den meisten Antworten
Programm Crashed wenn ich die Datei nach dem Laden versuche abzuspeichern

Frage
-
Ich soll für die Schule ein "Telefonbuch" beispiel programmieren
bei mir funktioniert das meiste im generellen funktioniert das speichern
laden die eingabe etc.
mein einziges Problem ist wenn ich eine Datei lade und sie dann versuche abzuspeichern stürzt das programm mit access violation ab.
wenn ich mir die methode laden mit haltepunkten anschaue dann ladet er die zahlen in das Telefonbuch aber sobald er aus laden rausgeht und ich versuche das Telefonbuch anzuschauen dann kommt es aufs glück an ob er dann noch den inhalt hat.
vllt ist noch hinzuzufügen das Laden und Speichern mit 1 Eintrag problemlos funktioniert aber ab 2-3 Einträge dann die fehlermeldung kommt.
Er liest aber genau so ein wie er abspeichert
case 2 ist noch nicht fertig deswegen braucht ihr euch das nicht anschauen
ich glaub generell liegt der fehler irgentwo in der methode speichern oder laden
// Telefonbuch_Poject_czacker.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #include "stdafx.h" #include <string.h> #include <stdlib.h> #include <stdio.h> #include <ctype.h> // für isdigit funktion #include <conio.h> #pragma warning (disable:4996) #define STRINGMAX 40 typedef struct Telefonbuch { int tag, monat, jahr; char titel[STRINGMAX]; char vorname[STRINGMAX]; char nachname[STRINGMAX]; char **adresse; char **email; char **telefonnummer; //weil Telefonnummer zu groß ist für int int *plz; char **ort; }Telefonbuch; //Prototypen char Menu(); void speichern(Telefonbuch *telefonbuch, int anzahl); void clear(); void Eingabe(Telefonbuch *telefonbuch, int groeße); void allokieren(Telefonbuch *telefonbuch, int groeße); int laden(Telefonbuch *telefonbuch, int *groeße); void austausch(Telefonbuch *telefonbuch, int max, int index) { Telefonbuch platz; //allokieren(platz, 1); platz = telefonbuch[max]; telefonbuch[max] = telefonbuch[index]; } int _tmain(int argc, _TCHAR* argv[]) { Telefonbuch *telefonbuch; static int groeße; static char auswahl; static int anzahl; groeße = 1; if ((telefonbuch = (Telefonbuch*)malloc((groeße)*sizeof(Telefonbuch))) == NULL) { printf("ERROR KEIN SPEICHERPLATZ"); return 1; } //Laden falls beim Start schon ein Telefonbuch vorhanden ist #pragma region start static char *name; FILE *start; if ((name = (char*)malloc(STRINGMAX*sizeof(char))) == NULL) { printf("Error"); } clear(); name = "Telefonbuch.txt"; start = fopen(name, "r"); if ((start) != NULL) { fscanf(start, "%i", &groeße); telefonbuch = (Telefonbuch*)realloc(telefonbuch, (groeße)*sizeof(Telefonbuch)); static int i; for (i = 0; i < groeße; i++) { fscanf(start, "%s", telefonbuch[i].vorname); fscanf(start, "%s", telefonbuch[i].nachname); fscanf(start, "%s", telefonbuch[i].titel); fscanf(start, "%i", &telefonbuch[i].jahr); fscanf(start, "%i", &telefonbuch[i].monat); fscanf(start, "%i", &telefonbuch[i].tag); static int j, help; fscanf(start, "%i", &help); if ((telefonbuch[i].telefonnummer = (char**)malloc(help * sizeof(char*))) == NULL) { printf("Error kein Speicherplatz"); return 2; } if ((telefonbuch[i].telefonnummer[0] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL) { printf("Error kein Speicherplatz"); return 4; } telefonbuch[i].telefonnummer[0] = (char*)help; for (j = 1; j < help; j++) { if ((telefonbuch[i].telefonnummer[j] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL) { printf("Error kein Speicherplatz"); return 4; } fscanf(start, "%s", telefonbuch[i].telefonnummer[j]); } fscanf(start, "%i", &help); if ((telefonbuch[i].plz = (int*)malloc((help)* sizeof(int))) == NULL) { printf("Error kein Speicherplatz"); return 11; } telefonbuch[i].plz[0] = help; for (j = 1; j < help; j++) { fscanf(start, "%i", &telefonbuch[i].plz[j]); } fscanf(start, "%i", &help); if ((telefonbuch[i].adresse = (char**)malloc(help* sizeof(char*))) == NULL) { printf("Error kein Speicherplatz"); return 2; } if ((telefonbuch[i].adresse[0] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL) { printf("Error kein Speicherplatz"); return 4; } telefonbuch[i].adresse[0] = (char*)(help); for (j = 1; j < help; j++) { if ((telefonbuch[i].adresse[j] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL) { printf("Error kein Speicherplatz"); return 4; } fscanf(start, "%s", telefonbuch[i].adresse[j]); } fscanf(start, "%i", &help); if ((telefonbuch[i].ort = (char**)malloc((help)* sizeof(char*))) == NULL) { printf("Error kein Speicherplatz"); return 2; } if ((telefonbuch[i].ort[0] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL) { printf("Error kein Speicherplatz"); return 4; } telefonbuch[i].ort[0] = (char*)(help); for (j = 1; j < help; j++) { if ((telefonbuch[i].ort[j] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL) { printf("Error kein Speicherplatz"); return 4; } fscanf(start, "%s", telefonbuch[i].ort[j]); } if ((telefonbuch[i].email = (char**)malloc((help)* sizeof(char*))) == NULL) { printf("Error kein Speicherplatz"); return 2; } if ((telefonbuch[i].email[0] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL) { printf("Error kein Speicherplatz"); return 4; } fscanf(start, "%i", &help); telefonbuch[i].email[0] = (char*)(help); for (j = 1; j < help; j++) { if ((telefonbuch[i].email[j] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL) { printf("Error kein Speicherplatz"); return 4; } fscanf(start, "%s", telefonbuch[i].email[j]); } } (groeße)++; anzahl = groeße - 1; printf("Telefonbuch gefunden\nLaden Erfolgreich"); getch(); fclose(start); clear(); } #pragma endregion while (1) { auswahl = Menu(); switch (auswahl) { case '1': { clear(); telefonbuch = (Telefonbuch*)realloc(telefonbuch, (groeße)*sizeof(Telefonbuch)); allokieren(telefonbuch, groeße); Eingabe(telefonbuch, ((groeße)-1)); groeße++; clear(); anzahl = groeße - 1; break; } case '2': { static char sucheing; static int testen; testen = 0; do { clear(); printf("Nach Vorname suchen ('V') "); printf("\nNach Nachname suchen ('N') "); printf("\nNach Titel suchen ('T') "); printf("\nNach Ort suchen ('O') "); printf("\nNach PLZ suchen ('P') "); printf("\nNach GeburtsJahr suchen ('J') "); printf("\nNach Email suchen ('E') "); printf("\nZurueck ('Z') "); printf("\n\nIhre Eingabe bitte : "); sucheing = getche(); switch (sucheing) { case 'v': case 'V': { static char* name; static int ergebnis; static char c; do { testen = 0; printf("Nach welchen Namen suchen : "); scanf("%s", name); if (strlen(name) <= 2) { printf("\nDer gesuchte Name ist zu kurz\n"); testen = -1; } else { do { c = name[testen]; if (isdigit(c)) { testen = -1; break; } testen++; } while (!(c == '\0') && testen < 40); } } while (testen == -1 || strlen(name) < 2); //Name Überprüfen auf Zahlen for (testen = 0; testen < anzahl; testen++) { ergebnis=strcmp(telefonbuch[testen].vorname, name); } break; } case 'n': case 'N': {printf("n"); break; } case 't': case 'T': {break; } case 'o': case 'O': { break; } case 'p': case 'P': { break; } case 'j': case 'J': { break; } case 'e': case 'E': {break; } case 'z': case 'Z': {break; } default: { printf("\nFalsche eingabe"); sucheing = '1'; getch(); break; } } } while (sucheing == '1'); clear(); break; } case '3': { speichern(telefonbuch, anzahl); getch(); clear(); } break; case '4': { if (laden(telefonbuch, &groeße) == (-1)) { clear(); break; } anzahl = groeße - 1; break; } case '5': { #pragma region löschen clear(); if (remove("Telefonbuch.txt") == 0) { printf("löschen Erfolgreich"); free(telefonbuch); if ((telefonbuch = (Telefonbuch*)malloc((groeße)*sizeof(Telefonbuch))) == NULL) { printf("ERROR KEIN SPEICHERPLATZ"); return 1; } groeße = 1; allokieren(telefonbuch, groeße); getch(); clear(); } #pragma endregion break; } case '6': { return 2; } default: { printf("\nFalsche Eingabe "); } } } getch(); return 0; } char Menu() { char i; printf("\n\tNeu (1)"); printf("\n\tSuchen (2)"); printf("\n\tAlle Speichern (Telefonbuch.txt) (3)"); printf("\n\tLaden (4)"); printf("\n\tganzes Telefonbuch Loeschen (5)"); printf("\n\tBeenden (6)"); printf("\n\nGeben Sie ein Was sie machen wollen (Zahl in der Klammer eingeben) "); i = getche(); return i; } void speichern(Telefonbuch *telefonbuch, int anzahl) { static int i,eingegeben; FILE *speichern; speichern = fopen("Telefonbuch.txt", "w"); fprintf(speichern, "%i\n", anzahl); for (i = 0; i < anzahl; i++) { static int eingegeben, j; fprintf(speichern, "%s\n", telefonbuch[i].vorname); fprintf(speichern, "%s\n", telefonbuch[i].nachname); fprintf(speichern, "%s\n", telefonbuch[i].titel); fprintf(speichern, "%i\n", telefonbuch[i].jahr); fprintf(speichern, "%i\n", telefonbuch[i].monat); fprintf(speichern, "%i\n", telefonbuch[i].tag); eingegeben = (int)telefonbuch[i].telefonnummer[0]; fprintf(speichern, "%i\n", eingegeben); for (j = 1; j < eingegeben; j++) { fprintf(speichern, "%s\n", telefonbuch[i].telefonnummer[j]); } eingegeben = telefonbuch[i].plz[0]; fprintf(speichern, "%i\n", eingegeben); for (j = 1; j < eingegeben; j++) { fprintf(speichern, "%i\n", telefonbuch[i].plz[j]); } eingegeben = telefonbuch[i].plz[0]; fprintf(speichern, "%i\n", eingegeben); for (j = 1; j < eingegeben; j++) { fprintf(speichern, "%s\n", telefonbuch[i].adresse[j]); } eingegeben = telefonbuch[i].plz[0]; fprintf(speichern, "%i\n", eingegeben); for (j = 1; j < eingegeben; j++) { fprintf(speichern, "%s\n", telefonbuch[i].ort[j]); } eingegeben = (int)telefonbuch[i].email[0]; fprintf(speichern, "%i\n", eingegeben); for (j = 1; j < eingegeben; j++) { fprintf(speichern, "%s\n", telefonbuch[i].email[j]); } fflush(speichern); } fclose(speichern); printf("\nAlle erfolgreich gespeichert unter Ausgabe "); } void clear() { system("cls"); } void Eingabe(Telefonbuch *eingabe, int groeße) { static char auswahl, c; static int anzahl, testen; c = '0'; anzahl = 2; testen = 0; do { clear(); #pragma region vorname do { testen = 0; printf("Vorname (abstaende mit _ ) : "); scanf("%s", eingabe[groeße].vorname); if (strlen(eingabe[groeße].vorname) <= 2) { printf("\nIhr Name wird wohl nicht so kurz sein...\n"); testen = -1; } else { do { c = eingabe[groeße].vorname[testen]; if (isdigit(c)) { testen = -1; break; } testen++; } while (!(c == '\0') && testen < 40); } } while (testen == -1 || strlen(eingabe[groeße].vorname) < 2); #pragma endregion #pragma region nachname do { testen = 0; printf("\nNachname : "); scanf("%s", eingabe[groeße].nachname); if (strlen(eingabe[groeße].nachname) <= 2) { printf("\nIhr Name wird wohl nicht so kurz sein...\n"); testen = -1; } else { do { c = eingabe[groeße].nachname[testen]; if (isdigit(c)) { testen = -1; break; } testen++; } while (!(c == '\0') && testen < 40); } } while (testen == -1 || strlen(eingabe[groeße].nachname) < 2); #pragma endregion #pragma region titel do { testen = 0; printf("\nTitel (abstaende mit _ ) : "); scanf("%s", eingabe[groeße].titel); if (strlen(eingabe[groeße].titel) < 2) { printf("\nIhr Titel wird wohl nicht so kurz sein...\n"); testen = -1; } else { do { c = eingabe[groeße].vorname[testen]; if (isdigit(c)) { testen = -1; break; } testen++; } while (!(c == '\0') && testen < 40); } } while (strlen(eingabe[groeße].titel) < 2 || testen == -1); #pragma endregion #pragma region Jahr do { printf("\nGeburtsJAHR (JJJJ) : "); scanf("%i", &(eingabe[groeße].jahr)); do { c = getchar(); } while (!(c == '\n')); } while (eingabe[groeße].jahr < 1960 || eingabe[groeße].jahr > 2015); #pragma endregion #pragma region monat do { printf("\nGeburtsmonat (MM) : "); scanf("%i", &(eingabe[groeße].monat)); do { c = getchar(); } while (!(c == '\n')); } while (eingabe[groeße].monat < 1 || eingabe[groeße].monat > 12); #pragma endregion #pragma region tag do { printf("\nGeburtstag (TT) : "); scanf("%i", &(eingabe[groeße].tag)); do { c = getchar(); } while (!(c == '\n')); } while (eingabe[groeße].tag < 1 || eingabe[groeße].tag > 31); #pragma endregion #pragma region telefonnummer anzahl = ((int)(eingabe[groeße].telefonnummer[0]) + 1); do { eingabe[groeße].telefonnummer = (char**)realloc(eingabe[groeße].telefonnummer, anzahl*sizeof(char*)); eingabe[groeße].telefonnummer[anzahl - 1] = (char*)malloc(STRINGMAX*sizeof(char)); do { testen = 0; printf("\nGeben Sie ihre Telefonnummer ein : "); scanf("%s", (eingabe[groeße].telefonnummer[anzahl - 1])); do { c = eingabe[groeße].telefonnummer[anzahl - 1][testen]; if (!isdigit(c)) { testen = -1; break; } testen++; } while (!(c == '\0') && testen < 40); } while (testen == -1 && c !='\0'); printf("\nWollen sie noch eine Nummer einlesen? ('n' abbrechen) : "); auswahl = getche(); printf("\n"); eingabe[groeße].telefonnummer[0] = (char*)anzahl; anzahl++; } while (auswahl != 'n'); #pragma endregion #pragma region adressen anzahl = eingabe[groeße].plz[0] + 1; do { eingabe[groeße].adresse = (char**)realloc(eingabe[groeße].adresse, anzahl*sizeof(char*)); eingabe[groeße].adresse[anzahl - 1] = (char*)malloc(STRINGMAX*sizeof(char)); printf("\nGeben Sie ihre Adresse ein (Strasse/Nummer) : "); scanf("%s", eingabe[groeße].adresse[anzahl - 1]); eingabe[groeße].ort = (char**)realloc(eingabe[groeße].ort, anzahl*sizeof(char*)); eingabe[groeße].ort[anzahl - 1] = (char*)malloc(STRINGMAX*sizeof(char)); do { testen = 0; printf("\nGeben Sie ihre Ort ein (Wien etc.) : "); scanf("%s", eingabe[groeße].ort[anzahl - 1]); do { c = eingabe[groeße].ort[anzahl - 1][testen]; if (isdigit(c)) { testen = -1; break; } testen++; } while (!(c == '\0') && testen < 40); } while (testen == -1); eingabe[groeße].plz = (int*)realloc(eingabe[groeße].plz, anzahl*sizeof(int)); do { printf("\nGeben Sie ihre PLZ ein : "); scanf("%i", &(eingabe[groeße].plz[anzahl - 1])); do { c = getchar(); } while (!(c == '\n') ); } while (eingabe[groeße].plz[anzahl - 1] <= 900); eingabe[groeße].plz[0] = anzahl; anzahl++; printf("\nNoch eine Adresse einlesen? ('n' zum Abbrechen) "); auswahl = getche(); printf("\n"); } while (auswahl != 'n'); #pragma endregion #pragma region email anzahl = (int)eingabe[groeße].email[0] + 1; do { auswahl = 'y'; eingabe[groeße].email = (char**)realloc(eingabe[groeße].email, anzahl*sizeof(char*)); eingabe[groeße].email[anzahl - 1] = (char*)malloc(STRINGMAX*sizeof(char)); printf("\n\nGeben Sie ihre email ein : "); scanf("%s", eingabe[groeße].email[anzahl - 1]); if ((strstr(eingabe[groeße].email[anzahl - 1], "@")) != NULL) { printf("\nNoch eine email einlesen? ('n' zum Abbrechen) "); auswahl = getche(); eingabe[groeße].email[0] = (char*)anzahl; anzahl++; printf("\n"); } } while (auswahl != 'n'); #pragma endregion printf("\nStimmen die obigen Angaben? J/N"); auswahl = getche(); } while (auswahl != 'J' && auswahl != 'j'); } void allokieren(Telefonbuch *telefonbuch, int groeße) { if ((telefonbuch[groeße - 1].telefonnummer = (char**)malloc(1 * sizeof(char*))) == NULL) { printf("Error kein Speicherplatz"); } if ((telefonbuch[groeße - 1].telefonnummer[0] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL) { printf("Error kein Speicherplatz"); } if ((telefonbuch[groeße - 1].plz = (int*)malloc(1 * sizeof(int))) == NULL) { printf("Error kein Speicherplatz"); } if ((telefonbuch[groeße - 1].ort = (char**)malloc(1 * sizeof(char*))) == NULL) { printf("Error kein Speicherplatz"); } if ((telefonbuch[groeße - 1].ort[0] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL) { printf("Error kein Speicherplatz"); } if ((telefonbuch[groeße - 1].adresse = (char**)malloc(1 * sizeof(char*))) == NULL) { printf("Error kein Speicherplatz"); } if ((telefonbuch[groeße - 1].adresse[0] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL) { printf("Error kein Speicherplatz"); } if ((telefonbuch[groeße - 1].email = (char**)malloc(1 * sizeof(char*))) == NULL) { printf("Error kein Speicherplatz"); } if ((telefonbuch[groeße - 1].email[0] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL) { printf("Error kein Speicherplatz"); } telefonbuch[groeße - 1].plz[0] = 1; telefonbuch[groeße - 1].email[0] = (char*)1; telefonbuch[groeße - 1].telefonnummer[0] = (char*)1; } int laden(Telefonbuch *telefonbuch, int *groeße) { #pragma region laden static char *name; FILE *laden; if ((name = (char*)malloc(STRINGMAX*sizeof(char))) == NULL) { printf("Error"); return 0; } do { clear(); printf("Geben Sie die zu ladene Textdatei ein\nSie muss im selben Pfad sein (abbrechen 'n') :"); scanf("%s", name); laden = fopen(name, "r"); if ((laden) == NULL && name[0] != 'n') { printf("\nDatei nicht gefunden"); getch(); } } while (laden == NULL && name[0] != 'n'); if (name[0] == 'n') { clear(); return -1; } fscanf(laden, "%i", groeße); telefonbuch = (Telefonbuch*)realloc(telefonbuch, (*groeße)*sizeof(Telefonbuch)); static int i; for (i = 0; i < (*groeße); i++) { static int j, help; fscanf(laden, "%s", telefonbuch[i].vorname); fscanf(laden, "%s", telefonbuch[i].nachname); fscanf(laden, "%s", telefonbuch[i].titel); fscanf(laden, "%i", &telefonbuch[i].jahr); fscanf(laden, "%i", &telefonbuch[i].monat); fscanf(laden, "%i", &telefonbuch[i].tag); fscanf(laden, "%i", &help); if ((telefonbuch[i].telefonnummer = (char**)malloc(help * sizeof(char*))) == NULL) { printf("Error kein Speicherplatz"); return 2; } if ((telefonbuch[i].telefonnummer[0] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL) { printf("Error kein Speicherplatz"); return 4; } telefonbuch[i].telefonnummer[0] = (char*)help; for (j = 1; j < help; j++) { if ((telefonbuch[i].telefonnummer[j] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL) { printf("Error kein Speicherplatz"); return 4; } fscanf(laden, "%s", telefonbuch[i].telefonnummer[j]); } fscanf(laden, "%i", &help); if ((telefonbuch[i].plz = (int*)malloc((help)* sizeof(int))) == NULL) { printf("Error kein Speicherplatz"); return 11; } telefonbuch[i].plz[0] = help; for (j = 1; j < help; j++) { fscanf(laden, "%i", &telefonbuch[i].plz[j]); } fscanf(laden, "%i", &help); if ((telefonbuch[i].adresse = (char**)malloc(help* sizeof(char*))) == NULL) { printf("Error kein Speicherplatz"); return 2; } if ((telefonbuch[i].adresse[0] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL) { printf("Error kein Speicherplatz"); return 4; } telefonbuch[i].adresse[0] = (char*)(help); for (j = 1; j < help; j++) { if ((telefonbuch[i].adresse[j] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL) { printf("Error kein Speicherplatz"); return 4; } fscanf(laden, "%s", telefonbuch[i].adresse[j]); } fscanf(laden, "%i", &help); if ((telefonbuch[i].ort = (char**)malloc((help)* sizeof(char*))) == NULL) { printf("Error kein Speicherplatz"); return 2; } if ((telefonbuch[i].ort[0] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL) { printf("Error kein Speicherplatz"); return 4; } telefonbuch[i].ort[0] = (char*)(help); for (j = 1; j < help; j++) { if ((telefonbuch[i].ort[j] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL) { printf("Error kein Speicherplatz"); return 4; } fscanf(laden, "%s", telefonbuch[i].ort[j]); } if ((telefonbuch[i].email = (char**)malloc((help)* sizeof(char*))) == NULL) { printf("Error kein Speicherplatz"); return 2; } if ((telefonbuch[i].email[0] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL) { printf("Error kein Speicherplatz"); return 4; } fscanf(laden, "%i", &help); telefonbuch[i].email[0] = (char*)(help); for (j = 1; j < help; j++) { if ((telefonbuch[i].email[j] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL) { printf("Error kein Speicherplatz"); return 4; } fscanf(laden, "%s", telefonbuch[i].email[j]); } } (*groeße)++; printf("\nLaden Erfolgreich"); getch(); clear(); return 0; #pragma endregion }
Antworten
-
Hallo,
Du übergibst in der Funktion einen Zeiger auf telefonbuch Struktur, also der Zeiger wird "by value" in der Funktion übergeben d.h. eine Kopie der Adresse von telefonbuch wird im Stack angelegt. Beim Allokieren wird die Adresse dem Zeiger, der sich im Stack befindet, zugewiesen. Dein Originalzeiger bleibt in diesem Fall uninitialisiert. Nach dem Verlassen der Funktion wird der Stack gelöscht und die Adresse des allokierten Speichers ist auch weg.
Richtig wäre ein Zeiger auf Zeiger zu übergeben.nt laden(Telefonbuch **telefonbuch, int *groeße);
Grüße- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 16. November 2015 09:48
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 24. November 2015 08:34
Alle Antworten
-
Hallo Ephaltes,
hast Du schon einmal versucht Dein Programm zu debuggen? Ich denke nicht. Ich würde Dir den Ratschlag geben dieses zu tun. In der Beschreibung hast Du ja genau beschrieben, was Du tun mußt für dne Absturz. Daher würde ich (ohne Dein Code genauer anzuschauen) Dir den Tip geben einfach mal einen Brakepoint am Anfang Deines Speicher Codes zu setzen, und dann Schritt für Schritt durchzusteppen.
Software Entwicklung ist halt nicht nur Code zu schreiben, sondern auch Fehler zu suchen. Nutze diesen Fall gleich, den Debugger dr IDE kennne zu lernen.
Best regards
Bordon
Note: Posted code pieces may not have a good programming style and may not perfect. It is also possible that they do not work in all situations. Code pieces are only indended to explain something particualar. -
ok
ich habe das programm jetzt debugged und es scheint als wäre während man die methode Laden ausführt alles in ordnung sprich alles wird richtig geladen, gespeichert ausgeführt etc.
aber sobald er die methode laden verlässt wäre es so als wäre er nie reingekommen
sprich die ganzen geladenen daten gibt es nicht mehr alles wegradiert, die angelegten sachen auch
aber ich übergebe ihn doch den pointer telefonbuch welches er bearbeiten kann oder? (wie in C# der ref parameter)
oder hab ich da gerade einen denkfehler?
-
Hallo,
Du übergibst in der Funktion einen Zeiger auf telefonbuch Struktur, also der Zeiger wird "by value" in der Funktion übergeben d.h. eine Kopie der Adresse von telefonbuch wird im Stack angelegt. Beim Allokieren wird die Adresse dem Zeiger, der sich im Stack befindet, zugewiesen. Dein Originalzeiger bleibt in diesem Fall uninitialisiert. Nach dem Verlassen der Funktion wird der Stack gelöscht und die Adresse des allokierten Speichers ist auch weg.
Richtig wäre ein Zeiger auf Zeiger zu übergeben.nt laden(Telefonbuch **telefonbuch, int *groeße);
Grüße- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 16. November 2015 09:48
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 24. November 2015 08:34