0

私は現在、C ++の記憶をリフレッシュするために本を読んでいます。私が取り組んでいる章は、動的メモリ割り当てに関係しています。私は練習問題をやっていますが、プログラムの何が問題なのかを理解するのに苦労しています。質問は

「ユーザーがそれぞれの友達と最後に話した時間を追跡できるようにするプログラムを作成します。ユーザーは新しい友達を (好きなだけ) 追加し、それぞれの友達と最後に話した日数を保存できるようにする必要があります。フレンド. ユーザーがこの値を更新できるようにします (ただし、負の値などの偽の数字を入力させないでください). フレンドの名前でソートされたリストを表示できるようにします. "

今のところ、プログラムにユーザーの入力を正しく保存させようとしています。

5人の友達を入力するとクラッシュするので、配列に書き込んでいると推測していますが、Resize関数がそれを処理する必要があります。

彼は私のコードです

#include <iostream>
#include <cstdlib>
#include <string>

using namespace std;

struct Friend
{
  string friends;
  int days;
};

Friend Resize(Friend* p_array, int* size_of_array);

int main()
{
  struct Friend f;
  int quit = 1;
  int array_size = 5;
  int number_of_friends = 0;
  Friend *p_array = new Friend [array_size];

  while(quit != 0)
  {
      cout << "Enter a friends name.\n";
      cin >> f.friends;
      cout << "Enter the number of days sence you last saw them.\n";
      cin >> f.days;
      cout << "Enter '0' to quit the program.\n";
      cin >> quit;

      if(array_size == number_of_friends)
      {
        Resize(p_array, &array_size);
      }

      p_array[number_of_friends] = f;

      number_of_friends++;
  }

  //print the array
  cout << endl;
  for(int i = 0; i < sizeof(p_array); i++)
  {
    cout << p_array[i].friends << " " << p_array[i].days << endl;
  }

  //delete the array
  delete [] p_array;


  return 0;
}

Friend Resize(Friend* p_array, int* size_of_array)
{
  *size_of_array *= 2;
  Friend *p_new_array = new Friend [*size_of_array];

  for(int i = 0; i < *size_of_array; i++)
  {
    p_new_array[i] = p_array[i];
  }

  delete [] p_array;

  p_array = p_new_array;
}
4

3 に答える 3

2
p_array = p_new_array;

Friend*これにより、ローカルパラメータが に割り当てられますp_new_array

そのため

p_array[number_of_friends] = f; 

無効なオブジェクトへのアクセスです。

次のように宣言Resizeします。

Friend Resize(Friend** p_array, int* size_of_array)

また

Friend Resize(Friend*& p_array, int* size_of_array)

この問題を解決します。

于 2013-04-03T21:06:38.650 に答える
0

クラッシュはサイズ変更機能によるものです。次の行でクラッシュが発生します。

for(int i = 0; i < *size_of_array; i++)
 {
    p_new_array[i] = p_array[i];
 }

size_of_array のサイズを 2 倍にしましたが、p_array には 5 つの要素しかありません。したがって、これは、ここで範囲外に踏み出すことを意味します。

于 2013-04-03T21:10:20.710 に答える
0

問題は、サイズ変更コードは問題ありませんが、Resize関数内のポインターのみを変更することです。main のポインターはまったく変更されません。もう 1 つのエラーは、配列をコピーする前に size_of_array 変数を 2 倍にするため、存在しない古い配列から要素をコピーすることになります。

このように関数を変更します

Friend* Resize(Friend* p_array, int* size_of_array)
{
  Friend *p_new_array = new Friend [*size_of_array * 2];

  for(int i = 0; i < *size_of_array; i++)
  {
    p_new_array[i] = p_array[i];
  }

  delete [] p_array;

  *size_of_array *= 2;
  return p_new_array;
}

そして、主にこのように使用します

if(array_size == number_of_friends)
{
    p_array = Resize(p_array, &array_size);
}

このように、Resize 関数は新しい配列を返し、それを main の p_array 変数に割り当てます。

于 2013-04-03T21:22:41.783 に答える