2017-01-06 4 views
-4

は、ここではいくつかのごみとなる配列にこのこれらの2つの割り当ての違いは何ですか?

char s[2][2]; 
s[0][0] = 1; 
s[0][1] = 2; 
s[1][0] = 3; 
s[1][1] = 4; 
cout << s[0][2]; 

出力値を割り当てる方法の一つであり、それは変化し続けます。しかし、奇妙なことは、私は

出力が 3

1 2 3 4 などの入力を与えるように私はとてもこの

char s[2][2]; 
for (int i = 0, j = 0; i <= 2; i++){ 
    if(i == 2) 
    { 
     j++; 
     i = 0; 
    } 
    if(j == 2) break; 
    cin >> s[j][i]; 
} 
cout << s[0][2]; 

を行うとどうなりますか?

最初に、私たちはインデックスを超えた配列を使用していると不平を言ってはいけません。

+1

's [0] [2]'はあなたの配列の要素ではありません。この要素にアクセスしようとすると、[未定義の動作](http://stackoverflow.com/questions/2397984/undefined-unspecified-and-implementation-defined-behavior)が発生します。定義されていない動作を入力すると、保証はありません。あなたのプログラムは何でもできるだけです。 –

+1

ヌル終了文字列がありません。配列の最後の要素の後にアクセスします。未定義のバハビールのような音。 – Gerhardh

+1

C++とCは異なる言語です。コードが交差点にありません。タグが編集されました。 –

答えて

4

CとC++を高速化することの1つは、が配列の境界を超えた場合にチェックしないことです。

代わりにundefined behaviorが表示されます。これを引き起こすと何かが起こります。プログラムがクラッシュしたり、正常に動作しているように見えたり、奇妙な結果が生じることがあります。

+0

場合によっては、2番目のコードが特定できないことがありますか? – user5954246

+0

@DenisKaどちらの場合でも、結果に依存することはできません。 's [0] [2]'は有効な配列インデックスではありません。 – dbush

+0

@dbush '[0] [2]'は 's [1] [0]'に相当します。なぜならC++は多次元配列の行主記憶域を必要とするからです。 – Barmar

1

まず第一に、それは我々がそのインデックス

号を超えて配列を使用していると文句を言うべきではない標準を使用すると、範囲外の配列を使用する場合、プログラムが文句を言う必要があることを指定していません。標準では、ビヘイビアが未定義であることを指定しています。

なぜそんなに違いがあるのですか?

動作は未定義です。両方の場合において。

関連する問題