【问题标题】:How do I declare a dynamic array of structs that contain a Queue member?如何声明包含 Queue 成员的动态结构数组?
【发布时间】:2017-08-07 02:13:25
【问题描述】:

这是来自已经上交的家庭作业。该程序是一个纸牌游戏,可以正确播放,但在游戏结束时会出现段错误。我可以将核心转储追踪到我的 delete [] playerArr,但我认为真正的问题在于我如何声明我的 playerArr。

我的 .h 文件中有一个构造函数、副本、重载运算符和析构函数,可以很好地与其他程序配合使用,所以我认为我的问题出在 main 上。我在这里和谷歌上查看了其他几个问题,但还没有找到一个非常像这样的问题。这是sn-ps的代码:

struct Player
{
  int currentHand;    //current number of cards in given player's hand
  Queue hand;         //queue to store player's hand
};

在 main 我分配了一个结构数组,我认为这是我的问题。我尝试了多种方法并犯了错误,但这种方法允许我的程序编译并且我的游戏按设计运行:

    //allocate array of Player structs
    Player *playerArr = new Player[numPlayers];
    for (int i = 1; i <= numPlayers; i++)
      playerArr[i].currentHand = 0;
    //enqueue playerArr.hand
    deal(playerArr, deck, numPlayers, currentDeck);

这是我在删除之前清理的顺序,cout 之后的核心转储:

   //exit do-while loop and end game
            }
  while (playerArr[currentPlayer - 1].currentHand != 0);


  for (int i = 1; i < numPlayers; i++)
    {
      while (playerArr[i].currentHand > 0)
        {
          playerArr[i].hand.dequeue(catchQ);
          playerArr[i].currentHand--;
        }
    }

  //empty all deck/discard stacks
  while (!deck.isEmpty())
    deck.pop(catchPop);
  while (!discard.isEmpty())
    discard.pop(catchPop);

  //reset hand/deck counters to defaults
  catchQ = 0;
  catchPop = 0;
  currentDeck = 52;
  currentPlayer = 1;
  numPlayers = 2;

  cout << "\n\n\n\t Good Game!" << endl << endl;

  //free dynamic memory
  delete [] playerArr;

对我来说改变这个项目的成绩已经太晚了,而且在期末考试周我没有时间在办公时间拜访我的教授,所以如果有人对我有解决方案,我可以从这个错误中吸取教训并继续前进。

谢谢

【问题讨论】:

  • 每当您想到“动态数组”时,您的下一个想法应该始终std::vector

标签: c++ struct linked-list queue dynamic-memory-allocation


【解决方案1】:

问题的一个可能原因是您忘记了数组索引是从零开始的。

numPlayers 元素数组的索引从 0numPlayers - 1(含)。

您展示的第一个循环没有使用它,而是从1numPlayers,导致您索引分配的内存超出范围,从而导致未定义的行为

【讨论】:

    猜你喜欢
    • 2020-11-09
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多