C: Array mit 5 Elementen nimmt 6 Zahlen auf

Moin,

ich versuche ein C-Programm zum Laufen zu bekommen. Es läuft auch, nur bringt Windows eine Fehlermeldung am Ende des Programmes. Mir ist mittlerweile auch klar, was das Problem ist: Der x-Array hat nur 5 Plätze frei, wird aber mit 6 Zahlen belegt. Ich frage mich nun eigentlich nur, warum es trotzdem funktioniert?? Auch der sechste Wert wird schön brav eingelesen und ausgegeben, obwohl es für diesen Wert ja eigentlich gar keinen „Platz“ geben dürfte? Der Quellcode lautet wie folgt:

/\* Das Programm soll gerade Werte in einem Array speichern und 
nach Eingabe von 6 geraden Zahlen oder nach Eingabe der Zahl 99 beenden. \*/


#include 

int main (void)
{
 int x[5];
 int k;
 int i;

 for (i=0; i

C-Anfänger dankt für Hinweise die zum besseren Verständnis von C beitragen.

thx
moe.

Hallo.

ich versuche ein C-Programm zum Laufen zu bekommen. Es läuft
auch, nur bringt Windows eine Fehlermeldung am Ende des
Programmes. Mir ist mittlerweile auch klar, was das Problem
ist: Der x-Array hat nur 5 Plätze frei, wird aber mit 6 Zahlen
belegt.

Das Arrays in C/C++ mit dem Indexwert ‚0‘ anfangen, ist bekannt ?

/* Das Programm soll gerade Werte in einem Array speichern und
nach Eingabe von 6 geraden Zahlen oder nach Eingabe der Zahl
99 beenden. */

#include

int main (void)
{
int x[5];

–> in ‚int x[4]‘ ändern
Moment, wird gleich mal unter SLES + Eclipse probiert :wink:

HTH
mfg M.L.

Moin,

ja, nein, ääähh.

Das Programm läuft schon und ich weiß auch, dass die Fehlermeldung verschwindet, wenn ich statt x[5] x[6] verwende. Meine Frage ist, warum es aber auch mit x[5] funktioniert, obwohl ich dann einem 5er Array sechs Zahlen übergebe…

thx
moe.

Hallo

Meine Frage ist, warum es aber auch mit x[5] funktioniert,
obwohl ich dann einem 5er Array sechs Zahlen übergebe…

Weil Du in C ohne weiteres „vitale“ Stukturen
des laufenden Prozesses überschreiben kannst
(was Du getan hast).

In Deiner Funktion ‚main()‘ sieht der
Speicherbereich von x[…] so aus:

 adresse daten\_auf\_adresse
 ---------------------------
 33400: [return\_from\_main]
 33404: [x[4] ]
 33408: [x[3] ]
 3340c: [x[2] ]
 33410: [x[1] ]
 33414: [x[0] ]
 33418: [k]
 3341c: [i]

Wenn die Funktion ‚main()‘ fertig ist,
kehrt sie mit

 call [return\_from\_main]

wieder an die Stelle zurück, von
der main() aufgerufen wurde.

Dieses klappt nicht, wenn die Adresse
überschrieben wurde, z.B. durch

 x[5] = 42;

Dann kommt eine Fehlermeldung.

Übrigens: viele Compiler erzeugen einen
„Sicherheitsbereich“ von 64 (oder mehr)
bytes vor der (ersten) Variablel x[…],
den sie mit einem Bitmuster initialisieren
(z.B. 0xCCCCCCCC in Microsoft-C).

Nach dem Ende des Programms wird nun
geprüft, ob Du dieses Muster überschrieben
hast - wenn ja, bekommst Du einen
„exception error“ oder sowas ähnliches.

Grüße

CMБ

2 Like

Danke.

WOW, das war jetzt etwas viel für mich :wink: aber ich glaube ich habe grob verstanden, was Du meinst.

thx
moe.

Abend

alles korrekt soweit aber das Array wird doch nicht rückwärts angelegt.

Stefan

Hallo Stefan

aber das Array wird doch nicht rückwärts
angelegt.

Deine Beobachtung ist korrekt,
hab ich doch tatsächlich den
Speicher „verkehrt-rum“ be-
schriftet (man wird alt …).
so muss es richtig lauten :

 adresse daten\_auf\_adresse
 ---------------------------
 vor Funktionsaufruf
 3341c: im Funktionsaufruf
 \>unten

Man ist eben schon raus, weil man sowas
kaum noch macht :wink:

Sorry

CMБ