2017-09-16 23 views
-2

私は、動的に割り当てられた配列がいくつかの整数を格納し、必要に応じて最大サイズを増やし、それに未ソートとソートされた配列の両方を表示できるプログラムを作成しようとしています注文。ポインタ、動的配列、メモリリーク

私のフルコードへのリンクは、下にあります。

私が最初に持っている問題は、サイズを最初に増やす必要がある場合に、動的に割り当てられた配列がhaywireになることです。関連するコードは以下の通りです。

while (counter <= arraySize) 
    { 
     cout <<"Please enter an integer number. Use 999999 (six 9's) to stop\n"; 
     if (counter == arraySize)   //If the counter is equal to the size of the array 
     {         //the array must be resized 
      arraySize +=2; 
      int *temp = new int[arraySize]; 
      for (counter = 0; counter < arraySize; counter++) 
      { 
       temp[counter] = arrayPtr[counter]; 
      } 
      delete [] arrayPtr; 
      arrayPtr = temp; 
      counter ++;      //the counter has to be reset to it's original position 
     }         //which should be +1 of the end of the old array 
     cin >> arrayPtr[counter]; 
     if (arrayPtr[counter] == sentinel) 
     { 
      cout << "Sentinel Value given, data entry ending.\n"; 
      break; 
     } 
     counter ++; 
    } 

これは代わりに、センチネル値を待つので、それだけで(何の境界チェックしないため)、その点を過ぎてメモリ内の整数をリストし始め意図しない操作を生成します。

次の問題は、私の並べ替え関数が実行を拒否していることです。私はこれを5つの値でテストしようとしましたが、プログラムはコードの特定の部分に到達するとクラッシュします。

機能は

sorting (arrayPtr); 

を使用して呼ばれているが、機能自体は、次のようになります。この問題に関する

void sorting (int *arr) 
{ 
    int count = 0, countTwo = 0, tempVal; 

    for (count = 0; arr[count] != 999999; count++)   //I figured arr[count] != 999999 is easier and looks better 
    {              //A bunch of if statements 
     for (countTwo = 0; arr[countTwo] != 99999; countTwo++) 
     { 
      if (arr[countTwo] > arr[countTwo+1]) 
      { 
       tempVal = arr[countTwo]; 
       arr[countTwo] = arr[countTwo+1]; 
       arr[countTwo+1] = tempVal; 
      } 
     } 
    } 
} 

すべてのヘルプは高く評価されます。私のソースコードへ

リンク:

http://www.mediafire.com/file/w08su2hap57fkwo/Lab1_2336.cpp

により、コミュニティからのフィードバックには、このリンクはできるだけ長くアクティブのままになります。

下記のリンクは私の修正されたソースコードです。それは私が作った間違いとそれを修正するための答えをより強調するために注釈されています。

http://www.mediafire.com/file/1z7hd4w8smnwn29/Lab1_2336_corrected.cpp

+0

これは教育上の理由がない限り、生の 'new'と' delete'を使用しないでください。 'std :: vector'は動的配列のはるかに良い選択肢です。 – ralismark

+0

これは教育上の理由によるものです。 –

+1

*これは私の質問に答えるまでアクティブになります。* - そして、このリンクはもはや存在しないので、SOに関するこの質問は役に立たなくなります。 – PaulMcKenzie

答えて

0

私はあなたのコードを中に見つけることができる最初の問題は、カウンタが0からARRAYSIZE-1になり、ループの最後の2回の反復が範囲外arrrayPtrにアクセスするためのループです。

次に、if (counter == arraySize)の末尾には、counter++;があります。この時点でcounterが既に配列を範囲外にインデックスしているため、これは必須ではありません。

最後に、ソート関数で内部ループが間違った値(99999ではなく99999)を探しますので、決して停止して境界から外れます。この種のエラーを防ぐには、名前のない名前空間のconstとしてsentinelを定義し、999999(エラーが発生する可能性があります...)と入力する代わりにコードを使用する必要があります。

+0

私はそれを感謝します。また、コンパイルエラーの原因となる 'sorting(int *)'関数の関数パラメータとして '&arrayptr'が渡されたコードがアップロードされていることに気付きました。今は完璧に動作します。 –

関連する問題