Frage: Beliebig viele Arrayelemente

Danielku15

Erfahrenes Mitglied
Hallo.
Ich habe eine Frage:
Wenn ich am Anfang des Programms einen Array mit 5 Elementen initialisiere:
Code:
 #include <iostream>
 using namespace std;
 
 double dblArrVariablen[5] = {0};
 ...

Warum ist es dann möglich beliebig viele Elemente hinzuzufügen. Normalerweise ist es doch nur möglich bis dblArrVariablen[4] Variablen zu vergeben. Ich habe bei einem Programm aus versehen dann der Variable dblArrVariable[5] einen Wert zugewiesen und es hat funktioniert. Hat dies irgendwelche Auswirkungen? Oder ist es gleichgültig ob dies gemacht wird. Ist C++ da flexibel?

mfg Daniel
 
Moin moin,

was du da beschreibst ist ganz übel.
C/C++ bietet dir die Möglichkeit dies zu machen und setzt da keinen Riegel vor (darüber das es falsch ist brauchen wir uns ja nicht zu unterhalten). Das ist unteranderm ein Grund für die Geschwindigkeit von C/C++ Programmen. Leider hat aber auch diese Medallie zwei Seiten :-( Da du "frei" im Speicher schreiben und lesen kannst - so wie du es gemacht hast - kann dein Programm mit dblArrVariablen[5] = 0 funktioniern -> aber das ist reines Glück. Wenn man bei grösseren Programmen sowas zu Beginn des Projekts macht, sind solche Fehler am Ende richtig übel zu finden, da von jetzt auf gleich Speicherlecks auftreten, obwohl man nicht oder an ganz anderer Stelle was im Projekt geändert hat.

Um auf deine Frage zurück zu kommen mach doch mal folgendes:
Code:
int i;
int j[2];
int k;

i=1;
j[0] = 2;
j[1] = 3;
j[2] = 4;
k=5;

Das ganze gehste mal im Debugger Schritt für Schritt durch und schaust dir den Inhalt aller Variablen gleichzeitig an.

Um beliebig viele Elemente zu bekommen. Informier dich über "Dynamische Speicherallokierung": c: malloc/realloc/calloc/free - c++ new/delete.

Viel Spass dabei.

Gruss Michael
 
Hallo erstmal,

das was du tust ist wie schon vom Vorgänger gesagt gaaaanz übel und
muss unbedingt unterbunden werden!
Der Name deines Arrays ist ein Pointer auf die Startadresse...
Mit dem Index i sagst du ihm eigentlich nur dass er im Adressbereich um i * x viele Bytes weitergehen soll, wobei x für die größe deines Datentypes steht.
Wenn du jetzt hergehst und an die Position 5 was reinschreibst, obwohl es nicht mehr zum Array gehört schreibst du den Speicherplatz von der Stelle an bis so gr0ß wie dein Datentyp ist komplett kaputt.
Das heißt das was da vorher stand wird von dir überschrieben...
Wenn du Glück hast, stand da nichts relevantes drin und wenn du Pech hast schon
-> Undefiniertes Verhalten !

Also immer aufpassen was du tust!

Mit sizeof() kannst du immer die Anzahl der Elemente bestimmen die du für dein Array festgelegt hast...
Code:
int i = (sizeof(array)/sizeof(Datentyp))
-> i ist die ANzahl der Elemente...

Grüße
 
RuFFnEcK hat gesagt.:
Mit sizeof() kannst du immer die Anzahl der Elemente bestimmen die du für dein Array festgelegt hast...

Wenn ich mich recht erinnere war vor kurzem nen Thread über den sizeof() Operator. In diesem wurde unteranderem festgestellt, das der sizeof() Operator nicht für dynamische Elemente gilt In diesem Fall muss man sich die Anzahl der Elemente selber merken.

Gruss Michael
 
Huch :D

kk lustigerweise hab ich grad eben noch komplett auf <vector> umgestellt, weil mir die Arrays aufn Sack gingen^^
Aber gut zu wissen, werde bestimmt ein paar Sachen mit dynamischen Arrays machen und hätte es genauso gemacht...

Grüße RuFF
 
Danke für die Antworten. Hatte eben in meinem Programmiertest in der Schule einen derartigen Fehler im Programm. Hat mich den 1er gekostet. Wollte mal eben wissen welche Konsequenzen es schlussendlich auf das Programm hat. Das blöde ist ja dass der Compiler keine Fehlermeldung ausspuckt sonst hätte ich es ausbessern könne. Dann sag ich mal vielen Dank für eure Infos.

greez Daniel
 
CodeFatal hat gesagt.:
Code:
..........
..........
 i=1;
 j[0] = 2;
 j[1] = 3;
 j[2] = 4;
 k=5;


Das ganze gehste mal im Debugger Schritt für Schritt durch und schaust dir den Inhalt aller Variablen gleichzeitig an.

Um beliebig viele Elemente zu bekommen. Informier dich über "Dynamische Speicherallokierung": c: malloc/realloc/calloc/free - c++ new/delete.

Viel Spass dabei.

Gruss Michael

Theoretisch geht dies jedoch.
Programmiere in ADA und du hast solch ein Problem nicht mehr.
Ich formuliere es mal so: C bzw. C++ behält sich die Rechte vor eine Zugriffsverletzung anzuprangern. Der richtige Weg ist wie schon Michael gesagt hat, durch dynamische Speicherallokierung(Zuweisung/Beschaffung) die Größe eines Arrays selbst zu bestimmen. Jedoch musst du dich dann aber auch um das löschen kümmern, denn dass kann der Compiler nicht noch für dich übernehmen ;)

Mache dich deswegen mit verketteten Listen vertraut, wie auf meiner Seite näher beschrieben: (krypthonas.de) und danach mit den STL Containern wie vector, list, set(Menge).

Mit freundliche Grüßen
 
Zurück