2017-06-01 1 views
1

Ich versuche, ein 10x10-Array mit Nullen gefüllt und dann drucken, aber die letzte Zeile füllt sich nicht mit Nullen.Warum ist die letzte Zeile meines Arrays mit Zufallszahlen gefüllt?

#include <iostream> 

using namespace std; 

int main() 
{ 

int table[9][9]; 
int height = 9; 
int width = 9; 

for(int i=0; i<=width; i++){ 
    for(int j=0; j<=height; j++){ 
     table[i][j] = 0; 
    } 
} 

for(int i=0; i<=9; i++){ 
    for(int j=0; j<=9; j++){ 
      cout << table[i][j] << " "; 
    } 
    cout << endl; 
} 
} 

Warum dies meine letzte Zeile machen zu kommen wie:

0 9 2 9 10 9 4201024 6422336 6422420 4199045 

Statt 0 wie der Rest der Zeilen?

+2

Wie viele Zeilen drucken Sie aus? – Galik

+0

sollten Sie nicht über ungültige Indizes iterieren. 8 ist der letzte Index nicht 9 – mvrma

+0

Ihre for-Schleifen gehen einen Index über das hinaus, was Sie in der Tabelle zugeordnet haben. Das '<=' sollte nur ein '<' sein. – DevlshOne

Antwort

2

Arrays in C++ werden von 0 indiziert. Das heißt, wenn Sie ein Array der Größe 9 haben, enthält es die Indizes 0-8. Wenn Sie den Index arr [9] überprüfen, erhalten Sie undefiniertes Verhalten. Der letzte Index eines Arrays in C++ ist seine Größe minus 1. In Ihren Schleifen hacken Sie den Index gleich der Größe des Arrays. Dies ist ein nicht definiertes Verhalten. Manchmal erhalten Sie einen segfault, manchmal erhalten Sie Zahlen, aber es ist nie definiert. Wenn Sie Ihre Loops ändern:

for(int i = 0; i<9; i++) 

statt:

for(int i = 0; i<=9; i++) 

Dann werden Sie dieses Verhalten nicht sehen. Wenn Sie ein 10x10-Array machen wollen, ändern Sie Ihre Array-Deklaration dazu:

int table[10][10]; 

und ändern Sie Ihre for-Schleife von 0 bis 9.

+0

@FabioTurati Du hast Recht, ich habe meine Antwort aktualisiert. Vielen Dank! –

1

Indizes iterieren beginnen mit 0. So sollte Ihre Schleife geändert werden von

for(int i=0; i<=width; i++) bis for(int i=0; i<width; i++).

Derzeit drucken Sie eine zusätzliche Zeile aus, die nicht zu Ihrem Array gehört.

Der Grund, warum es scheint, zufällige Werte zu sein, ist, weil es tatsächlich ausdruckt, was im Speicher an diesem Ort gespeichert ist, könnte dies alles von Code zu tatsächlichen Daten sein.

1

Ihre Indizes liegen außerhalb des Bereichs für das von Ihnen instantiierte 2D-Array. Ein Index von 9 ist das 10. Element in einem Array, aber Sie haben nur Speicher für 9 Elemente zugewiesen, so dass Sie zufällige Zahlen erhalten, da diese Werte aus dem benachbarten Speicher neben dem Array im RAM zurückgegeben werden.

0

Der Code definiert Ihr 10x10-Array als 9x9-Array. Wenn wir es als 10x10-Array behandeln, ergibt sich eine Reihe von Out-of-Bounds-Zugriffen. int table[10][10] wird viel besser funktionieren. Und im Allgemeinen verwenden Sie manifest Konstanten für Größen:

const int height = 10; 
const int width = 10; 
int table[height][width]; 
for (int i = 0; i < height; ++i) ... 
Verwandte Themen