2016-06-27 15 views
0

2つの配列番号AとBを入力しようとしましたが、最後のB番号を入力するたびに、B [i + n]の値が変更されただけで、A例えばC++配列に間違った値が格納される

#include <iostream> 

    using namespace std; 

    /* 
    * 
    */ 
    int main(int argc, char** argv) { 
     int a[] = {}; 
     int b[] = {}; 
     int t, i; 

     cout << "Amount of numbers: "; 
     cin >> t; 

     for (i = 0; i < t; i++) { 
      cout << "Enter number for A" << i+1 << ": "; 
      cin >> a[i]; 
      cout << "Enter number for B" << i+1 << ": "; 
      cin >> b[i]; 
     } 

     for (i = 0; i < t; i++) { 
      cout << a[i] << " "; 
      cout << b[i] << " "; 
     } 
     return 0; 
    } 

Amount of numbers: 2 
Enter number for A1: 1 
Enter number for B1: 2 
Enter number for A2: 3 
Enter number for A3: 4 

出力が1 2 3 4のはずが、コードからI 4 2 3 4を(Bの[1を得た:[0]ここ コードであります] A [0]の値を置き換えます。

誰かh私はこれを修正するために私をelp?ありがとう

+0

ゼロサイズの配列に書き込んでいます。破損したコードは破損した結果と同じです。 –

答えて

8

問題は、指定されていないサイズの2つのスタック割り当て配列を使用していることです。これらの配列は、{ }で初期化しているため0です。

これらの配列は動的ではありません。あなたが行っているような要素を追加することはできません。それらのサイズは、直接的にまたは初期化を通じて先験的に指定する必要があります。コンパイル時にスタック上に予約されています。つまり、aの要素にアクセスしようとすると、次に格納されるのでbになりますもう一方へ。あなたは

std::vector<int> a; 
.. 
a.resize(t); 
.. 
cin >> a[i] 
3

あなたはサイズのない配列を割り当てています。

動的サイズの配列が必要な場合は、std :: vectorを試してください。

1

を行うことができるように

2本使用std::vector<int>ではなく、ゼロサイズの配列は、C++で無効であり、このコードは、私が試した2つのコンパイラでコンパイルしていません。

生の配列の代わりにstd::vectorを使用できます。

std::vectorを使用すると、push_backメンバー関数を使用して最後に項目を追加できます。

2

他にも言及したように、スタックに空の配列を割り当ててから、その配列の境界を超えてアクセスすることが起こります。これはあなたが最初に気づくよりもはるかに悲惨な結果をもたらします。

@ジャックが言いましたように、a[0]以降の書き込みは、bで書き込みを開始し、プログラムの最後に重複して無意味な値を与えます。おそらくあまり明白でないのは、tiを上書きすることになります。これは、abの後にスタックに割り当てられているためです。私のポイントを説明するために、以下の出力を見て:

Amount of numbers: 2 
Enter number for A1: 1 
Enter number for B1: 2 
Enter number for A2: 3 
Enter number for B2: 4 
Enter number for A3: 5 
Enter number for B3: 6 
a[0] 0x7fffffffe2e0 -> 1 
b[0] 0x7fffffffe2e4 -> 3 
a[1] 0x7fffffffe2e4 -> 3 
b[1] 0x7fffffffe2e8 -> 5 
a[2] 0x7fffffffe2e8 -> 5 
b[2] 0x7fffffffe2ec -> 2 
a[3] 0x7fffffffe2ec -> 3 
b[3] 0x7fffffffe2f0 -> 4197280 
a[4] 0x7fffffffe2f0 -> 4197280 
b[4] 0x7fffffffe2f4 -> 0 
t 0x7fffffffe2e8 -> 5 
i 0x7fffffffe2ec -> 5 

あなたは、プログラムが原因tあるだけ期待2.なく、期待どおりに動作していない、とあなたはA/B3の入力を求めるメッセージが表示されていることに注意しましょうb[1]またはa[2]が書き込まれたときに上書きされます。これらはすべて同じアドレスに対応しているため、ループ状態は失敗します。

スタックに配列を割り当てるには、コンパイル時にサイズを指定する必要があります。 int a[10]などです。これは、実行前にサイズがわかっている場合に使用されます。あなたの場合のようにサイズが不明な場合は、new[]でヒープに配列を割り当てることができます。

もちろん、あなたが期待する結果が得られます
cout << "Amount of numbers: "; 
cin >> t; 

int* a = new int[t]; 
int* b = new int[t]; 

Amount of numbers: 2 
Enter number for A1: 1 
Enter number for B1: 2 
Enter number for A2: 3 
Enter number for B2: 4 
a[0] 0x603010 -> 1 
b[0] 0x603030 -> 2 
a[1] 0x603014 -> 3 
b[1] 0x603034 -> 4 
t 0x7fffffffe2d8 -> 2 
i 0x7fffffffe2dc -> 2 

推奨されるソリューションは、ヒープ割り当てがあなたのために行われstdコンテナ、すなわちstd::vectorを、使用することを、もちろん、あり、

std::vector<int> a; 
std::cin >> input; 
a.push_back(input); 
+0

どのコンパイラとオプションを使用しましたが、無効なコードを受け入れましたか? –

+0

g ++、オプションを思い出さないでください。今はオフィスではありません。 C++では有効ではありませんが、C99で明らかに有効な1つの要素を割り当てているようですね。 http://stackoverflow.com/a/15494762/5090527私は答えがまだ役に立つと思うが、私は間違いなくメモを追加する。 – Ramon

関連する問題