Frage

Sorry, wenn dies eine noob Frage ist :(.

Ein Stück C-Code.

int array[5];
int cnt;

for(cnt = 0; cnt <= 10; cnt+=1)
{
      array[cnt] = cnt;
}

Wenn Sie einen Fehler geben, nicht wahr? Nein! Funktioniert gut! Aber warum ist das so? Es scheint, dass -in der erste einer Reihe von mehr als die doppelte Größe line- (11) definiert ist. Sie können sogar Array zugreifen [5 bis 10] später. Und das ist verwirrend mich. Es funktioniert nicht mehr, wenn Sie definieren array [4 oder weniger] ...

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Es kann vorkommen, mit Ihrem speziellen Compiler und Computer arbeiten, aber man sollte nicht auf sie zählen.

Das Verhalten des Codes gemäß der C-Sprachspezifikation ist undefined . Das bedeutet, dass es vielleicht tun, was Sie hoffen, oder es könnte Ihr Computer zum Absturz bringen, oder es könnte dazu führen, Dämonen Nase fliegen.

Im Gegensatz zu höheren Sprachen wie Java und C #, C vertrauen Sie und führt keine explizite Kontrolle der Grenzen des Arrays. Sie sollen außerhalb der Grenzen des Arrays treten verantwortlich und nicht sein.

Andere Tipps

Dies ist nur „funktioniert“, wenn Ihre Definition von „Werk“ ist ein Synonym für „abgestürzt ist noch nicht“.

Was Sie sehen, ist nicht definiertes Verhalten , die durch Sie das Array mit einem ungültigen Index zugreifen. Undefiniertes Verhalten bedeutet, dass etwas passieren könnte, auch Ihr Programm erscheint korrekt zu arbeiten.

"Aber warum ist das?"

Weil das der Weg C ist.

Array Grenzen sind nicht zur Laufzeit überprüft.

Das ist das "Gesetz des C"

Ich mag nur darauf hinweisen, dass all dies in der Tat nicht definiert ist. Ihr Beispiel „Werke“ in diesem speziellen Beispiel, weil beide Variablen auf dem Stapel befinden. Dies ist die Adresse des cnt knapp unter dem Ende des Arrays ist. Wenn cnt erreicht cnt == 5 die Anweisung array [cnt] = cnt; schreibt nicht in dem Speicher zu dem Array gewidmet, sondern nur danach, wenn die Anschrift des cnt legen. Es ist nur ein Glück, dass es nicht Ihren Zähler verändern. Wenn cnt> 5 dort Müll kein Speicher ist, und es wird in dem „Stapel leer“ (weiß nicht, das richtige Wort) nur schreiben.

ein weiteres Beispiel zu veranschaulichen dies:

int main(int ac,char **av)
{
    int a[5];
    int cnt;
    int cnt2=3;

    for(cnt=0;cnt<7;cnt++) {
        a[cnt]=cnt;
        printf("%d %d %d\n", a[cnt], cnt, cnt2);
    }
}

Ausgabe:

0 0 3
1 1 3
2 2 3
3 3 3
4 4 3
5 5 5
6 6 5

Die letzten beiden schreibt der Schleife überschreibt die Stapeldaten nach a [] und kann sehr verwirrend Fehler ergeben. In diesem Fall wird die cnt2 trashed.

Arrays in C nicht zur Laufzeit überprüft. Mit anderen Worten, können Sie „definieren“ ein Array der Größe N und Zugang glücklich vom Ende des Feldes weg gebunden. Wenn Sie über das Ende des Feldes gehen, dann werden Sie Speicher irgendwo auf dem Stapel Müll (oder dem Heap).

Wenn Sie Speicher irgendwo Müll, Ihr Programm ist wahrscheinlich zum Absturz bringen. Diese Abstürze können hart sein, auf der Spur, weil sie vielleicht weit weg Absturz von wo aus man überflutete tatsächlich das Ende des Arrays.

Normalerweise, wenn Sie Arrays in C deklarieren, ist es am besten, eine Art Konstante oder #define verwenden, um die Größe des Arrays zu markieren:

#define MAX_ELEMENTS 10
int array[MAX_ELEMENTS];
int cnt;
for(cnt = 0; cnt < MAX_ELEMENTS; cnt+=1) {
   array[cnt] = cnt;
}

Wenn Sie Vergangenheit MAX_ELEMENTS im Array Zuordnung gehen, könnten Sie den Wert cnt überschreiben. Sie könnten eine andere Variable überschreiben. Alles hängt von den Compiler und der Codestruktur. Beachten Sie auch die Verwendung des

Array Grenzen in C nicht unbedingt überprüft zur Laufzeit. Der Standard lässt Implementierer frei, dies zu tun, wenn sie sich entscheiden, oder nicht - das ist ein Teil dessen, was undefined . Auf einer Umsetzung mit fetten Zeiger könnte die Probe in der Tat eine Art von Fehler verursachen.

Wenn Sie das Ende des Arrays ablaufen, Sie sind Speicher überschrieben wird, dass die Software nicht erwartet und die Heap-korrumpieren. Sie Software kann weiterhin ausgeführt werden, aber es wird sehr instabil sein!

Abhängig von, wie der Stapelspeicher gefüllt ist. Auch wird es glücklich, diese Werte überschreiben und sie sogar lesen, aber höchstwahrscheinlich korrumpieren Sie den Stapel.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top