2017-06-01 3 views
1

私は10x10アレイを0で埋めて印刷しようとしていますが、最後の行は0でいっぱいになりません。行の残りの部分のような配列の最後の行が乱数で埋められているのはなぜですか?

0 9 2 9 10 9 4201024 6422336 6422420 4199045 

代わりの0:

#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; 
} 
} 

なぜこれが私の最後の行のように出てくる作るのでしょうか?

+2

印刷する行の数はいくつですか? – Galik

+0

無効なインデックスを反復処理しないでください。 8は最後のインデックスではありません9 – mvrma

+0

forループは、テーブルに割り当てられたインデックスを超えて1つのインデックスになります。 '<='は '<'のみでなければなりません。 – DevlshOne

答えて

2

C++の配列は0からインデックスされます。つまり、サイズが9の配列の場合、インデックスは0〜8のインデックスを含みます。インデックスarr [9]をチェックすると、未定義の動作が発生します。 C++の配列の最後のインデックスは、そのサイズから1を引いたものです。ループでは、配列のサイズに等しいインデックスを取得します。これは未定義の動作です。場合によってはセグメンテーションを取得することもありますが、数値を取得することもありますが、決して定義されません。

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

の代わり:あなたがあなたのループを変更する場合は

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

次に、あなたは、この動作は表示されません。あなたは、10×10の配列を作るあなたの配列の宣言はこれに変更する場合:

int table[10][10]; 

をし、0から9

+0

@FabioTuratiあなたが正しいです、私は私の答えを更新しました。ありがとう! –

1

に反復処理するループのためにあなたを変更インデックスは0でだからあなたのループを変更する必要があります開始しますから

for(int i=0; i<=width; i++)からfor(int i=0; i<width; i++)です。

現在、アレイに属していない行が1行追加されて印刷されています。

ランダム値であるように見える理由は、実際にその場所にあるメモリに保存されているものを印刷しているためです。これは、コードから実際のデータまでのものである可能性があります。

1

インデックスは、インスタンス化した2次元配列の範囲外です。 9のインデックスは配列の10番目のアイテムですが、RAM内の配列の隣にある隣接するメモリから返される値なので、乱数を取得するので、9個のアイテムのメモリを割り当てただけです。

0

コードは、10x10アレイを9x9アレイとして定義しています。これを10x10アレイとして扱うと、範囲外のアクセスが発生します。 int table[10][10]はもっとうまく動作します。一般的に、サイズにはマニフェスト定数を使用してください:

const int height = 10; 
const int width = 10; 
int table[height][width]; 
for (int i = 0; i < height; ++i) ... 
関連する問題