【发布时间】:2016-08-13 19:38:51
【问题描述】:
我正在尝试从一个名为deck 的链接列表中删除一个“卡片”(节点)并将其移动到玩家的手上。总体而言,这是玩家抽牌的地方,因此该牌将被添加到他们的手上并从牌组中完全删除。我查看了Linked Lists: Moving a node from one linked list to the next 并尝试遵循这种格式以及我的发牌功能的修改格式。不幸的是,我的函数没有输出任何东西。我已经多次修改了这个函数,但我认为问题在于将内存分配到手中的新空间。我还尝试了手和甲板的指针,因为这解决了我代码中的许多其他问题,但我的方法似乎没有什么不同。这是我最近的尝试。这绝对是我更复杂的尝试之一,因为每当我编辑它时,我似乎只是添加了更多的代码行。
void drawCard (card* hand, card* deck) {
card* newCard = NULL;
newCard = (card*)malloc(sizeof(card*));
deck = deck->listp;
newCard = hand;
while (hand != NULL) {
hand = hand->listp;
}
newCard->face = deck->face;
newCard->suit = deck->suit;
hand = newCard->listp;
}
我在写这篇文章时的想法是将牌组移动到列表中的下一个位置(第一个位置是游戏中的“顶牌”),那将是用于抽牌的牌。然后我将 newCard 设置为 hand 的第一个位置,然后将 hand 移动到列表的最后。我认为这会在玩家的手牌顶部打开一个位置,但我似乎弄错了。另外,我意识到我没有添加一个部分来从卡组中删除节点。我是否只需创建一个临时变量,将卡片节点复制到临时变量,然后将其从卡组中释放?任何指导将不胜感激。
【问题讨论】:
-
您对
malloc的调用使用了错误的大小。你需要sizeof(card),而不是sizeof(card *)。这是一个等待发生的分段错误。 -
newCard = (card*)malloc(sizeof(card*));thennewCard = hand;导致严重的内存泄漏。您正在为NewCard分配内存,然后失去了对它的跟踪。 -
谢谢@TomKarzes!我完全错过了那个额外的星号。
-
@alvits 可以解释错误的访问错误。不幸的是,尽管我多次尝试修复此功能,但最终却因失去记忆而变得更糟!谢谢
标签: c pointers linked-list nodes