2016-12-09 13 views
1

有するメモリ位置Iは、次のコードを持っている:C++配列ポインタ

#include <iostream> 
using namespace std; 

int *growArray (int* p_values, int cur_size) 
{ 
    int *p_new_values = new int[ cur_size * 2 ]; 
    for (int i = 0; i < cur_size; ++i) 
    { 
     p_new_values[ i ] = p_values[ i ]; 
    } 
    delete p_values; 
    return p_new_values; 
} 
int main() 
{ 
    int next_element = 0; 
    int size = 10; 
    int *p_values = new int[ size ]; 
    int val; 
    cout << "Please enter a number: "; 
    cin >> val; 
    while (val > 0) 
    { 
     if (size == next_element + 1) 
     { 
      cout<< "Im in If"<<endl; 
      p_values = growArray(p_values, size); 
     } 
     p_values[ next_element ] = val; 
     cout << "Please enter a number (or 0 to exit): "; 
     cin >> val; 
    } 

} 

このコードはdynamicllyメモリを割り当てています。私はこのコードのすべてを理解することができます。この場合の目的は何ですか?どんなに多くのインプットを与えても、プログラムは決してそれに入りません。文がtrueに評価されていないと同じ第1の要素が上書きされている場合

+1

'のようになります。 ? –

+0

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

+0

私もこれに気づきました...このコードは本からのものです。私は間違っているとは思わない。しかし、私は知りません.. –

答えて

1

あなたが最初にある変数next_elementの価値を高めることはありません。したがって0

int next_element = 0; 

中での発現に等しい

p_values[ next_element ] = val; 

プログラム全体が間違ったロジックを持っています。例えば、if文は

if (size == next_element) 
     ^^^^^^^^^^^^^^^^^^^^ 
{ 
    cout<< "Im in If"<<endl; 
    p_values = growArray(p_values, size); 
    size *= 2; 
    ^^^^^^^^^ 
} 

のようになります。そして、この文は

p_values[ next_element++ ] = val; 
        ^^^^^ 

のようになります。そして、whileループは、ループ内で変更されることはありませんnext_element`

cout << "Please enter a number: "; 
while (cin >> val && val > 0) 
{ 
    //... 
    cout << "Please enter a number (or 0 to exit): "; 
} 
+0

本のコードはどうやって間違っていますか? –