有阵列和指针的问题

时间:2013-04-03 21:02:22

标签: c++ arrays pointers structure

我目前正在读一本书来刷新我对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;
}

3 个答案:

答案 0 :(得分: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)

解决这个问题。

答案 1 :(得分:0)

崩溃是由于调整大小功能造成的。 以下行导致崩溃:

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

你将size_of_array的大小加倍,但是p_array只有5个元素。所以这意味着你在这里走出界限。

答案 2 :(得分:0)

问题是虽然调整大小的代码很好,但它只会更改Resize函数内的指针。 main中的指针永远不会改变。另一个错误是在复制数组之前将size_of_array变量加倍,因此最终会复制旧数组中不存在的元素。

像这样更改你的功能

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变量。