Probleme mit dynamischem Array
-
Guten Abend...
...ich hab da ein kleines Problem
Im Groben geht es um dynamische Arrays. Ich versuche als Übung so ein kleines Verwaltungsprogramm für Bankkonten zu schreiben (Hinzufügen, löschen, einzahlen, abheben usw...)um die Konten möglichst komfortabel verwalten zu können habe ich eine Struktur angelegt:
struct s_account { int acc_type; string name; int acc_number; float balance; };Da ich nicht weiß wie viele Konten zusammenkommen, wird als nächstes ein dynamisches Array erstellt, welches zu ersteinmal zwei Felder hat:
s_account* accounts = new s_account[1];Feld 0 wird nur genuzt um die Anzahl der Einträge mitzuzählen. Um eine Funktion, welche später alle Konten auflisten soll zu testen, habe ich einen Beispieldatensatz eingefügt:
accounts[1].acc_type = 1; accounts[1].name = "Max Mustermann"; accounts[1].acc_number = 2275; accounts[1].balance = 569.35;Genau an dieser stelle wird es seltsam. denn sobald ich accounts[1].name "Max Mustermann" zuweisen möchte, kommt es beim Ausführen zu einem Speicherzugriffsfehler. An einem fehlenden #include <string> kann es schonmal nicht liegen...
Die Fehlermeldung ist ebenfalls nicht sonderlich hilfreich, alles was die Konsole sagt ist:pixelrealm@tbook:~/Development/Konten$ g++ -o main main.cpp pixelrealm@tbook:~/Development/Konten$ ./main SpeicherzugriffsfehlerWeiß jemand woran das liegen kann?
Vielen Dank schonmal für's gedanken machen,Tobi
Fast vergessen: Debian 5.0 mit GCC 4.3.2
-
Bei Arrays beginnt der Index bei 0!
Mit new MyType[1] erstellst Du ein Array mit 1 Element. Und mit Index 1 greifst Du auf ein nicht existierendes Element zu.Simon
-
hast recht, das war das Problem. Danke auf jeden Fall!
Eine andere Sache ist dann allerdings wieder seltsam: wenn ich die string-Zeile auskommentiere, läuft das Programm soweit ich das beurteilen kann korrekt:s_account* accounts = new s_account[1]; //BSP-Daten accounts[1].acc_type = 1; //accounts[1].name = "M"; accounts[1].acc_number = 2275; accounts[1].balance = 569.35;Das Kommt als Ausgabe dabei rum:
Konto-Manager ---------------------------------------------------- 1 2275 569.35 Anzahl Konten: 1Liegt das daran das der Variablentyp "string" nachträglich zugefügt wurde und nicht zur Grundfunktionalität von C++ gehört?
Tobi
-
Liegt das daran das der Variablentyp "string" nachträglich zugefügt wurde und nicht zur Grundfunktionalität von C++ gehört?
Nein.
Wie sieht dein Ausgabe Code aus?
Simon
-
PixelRealm schrieb:
Liegt das daran das der Variablentyp "string" nachträglich zugefügt wurde und nicht zur Grundfunktionalität von C++ gehört?
Nein. Wahrscheinlich liegt es eher daran, dass die Zuweisung an
std::stringum einiges komplexer als bei skalaren Datentypen ist (z.B. kann Speicher angefordert und freigegeben werden). Wenn das alles auf einem Speicherplatz passiert, der dir gar nicht zur Verfügung steht, kann das Programm schnell mal abstürzen.Aber grundsätzlich sind Dinge wie Überschreiten von Array-Grenzen undefiniertes Verhalten. Versuche also nicht, durch Experimente voreilige Schlüsse zu ziehen. Das Ergebnis kann bei jedem Compiler wieder anders aussehen.
-
OKay, die Erklärung leuchtet ein. Vielen Dank für die kompetente Hilfe

Tobi