【问题标题】:Having trouble with arrays and pointers数组和指针有问题
【发布时间】:2013-03-25 18:02:24
【问题描述】:

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

【问题讨论】:

  • 顺便说一下,sizeof(p_array)sizeof(Friend *)。它与“数组”中的元素数量无关。
  • 此外,您没有 Resize() 的返回值,但声明了 Friend 类型之一。无论如何,学习如何做到这一点,然后立即微笑,因为您知道您永远不必使用标准库中的所有容器供您使用。
  • @WhozCraig 这与 stl 容器或容器完全无关。它是关于语言语义的,人们肯定必须知道这些。
  • @Paranaix 这就是我说“学习如何做到这一点”的原因,还是不为人知?
  • @WhozCraig 对不起,我好像理解错了。不应该是冒犯。

标签: c++ arrays pointers structure


【解决方案1】:

问题在于,虽然您的调整大小代码还不错,但它只会更改 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变量,

【讨论】:

    【解决方案2】:

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

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

    您将 size_of_array 的大小增加了一倍,但 p_array 只有 5 个元素。所以这意味着你在这里越界了。

    【讨论】:

      【解决方案3】:
      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)
      

      解决这个问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多